我有一张区域表area:areaid,areaname,propertyid
还有一张设施表property:propertyid,propertyname
现在我有一个需求就是保存在area表里的propertyid是有多个值的,比如说1,2,3这种,现在我想通过一个sql语句来输出我区域里propertyid所对应的propertyname。
我开始是这样写的:
[code="SQL"]
select a.areaid,a.areaname,p.propertyname from area a ,property p where a.propertyid in (select propertyid from property)
[/code]
但是很明显,不对,不知道有哪位大大知道?注:公司用的是sqlserver,所以最好是能兼容sqlserver的sql写法。如果能够提供oracle的写法,那就更好了,感激不尽!
别整这么些复杂的,既然area中propertyid的ID是多个那么就property中in过去就可以了嘛。
select b.propertyname from property a ,area b where a.propertyid in b.id
行吗? 试试
[code="sql"]
select a.areaid,a.areaname,propertyname=(
select propertyid from property p
where p.propertyid=a.propertyid
) from area a [/code]
[code="sql"]
select a.areaid,a.areaname,p.propertyname from area a ,property p where a.propertyid=p.propertyid[/code]
这样都行啊··
用左连接
[code="sql"]select a.areaid,a.areaname,p.propertyname from area a left join property p on a.propertyid = p.propertyid[/code]
查询时就是
[code="sql"]select a.areaid,a.areaname,p.propertyname from area a left join property p on a.propertyid = p.propertyid where a.areaid = 'asdf'
[/code]
自己写个字符串拆分函数吧。
oracle的拆分函数如下:
[code="java"]
CREATE OR REPLACE TYPE str_split IS TABLE OF VARCHAR2 (4000);
CREATE OR REPLACE FUNCTION splitstr(p_string IN VARCHAR2, p_delimiter IN VARCHAR2)
RETURN str_split
PIPELINED
AS
v_length NUMBER := LENGTH(p_string);
v_start NUMBER := 1;
v_index NUMBER;
BEGIN
WHILE(v_start <= v_length)
LOOP
v_index := INSTR(p_string, p_delimiter, v_start);
IF v_index = 0
THEN
PIPE ROW(SUBSTR(p_string, v_start));
v_start := v_length + 1;
ELSE
PIPE ROW(SUBSTR(p_string, v_start, v_index - v_start));
v_start := v_index + 1;
END IF;
END LOOP;
RETURN;
END splitstr;
[/code]
这样结合起来使用。参考[url]http://www.cnblogs.com/gnielee/archive/2009/09/09/1563154.html[/url]
[code="java"]
贴下表的数据啊··
···
[/code]
结合上面的函数sql大致如下:
[code="java"]
select propertyname from property where propertyid in (select * from table(splitstr(select propertyid from area where areaid = ?,',')))
[/code]
[code="sql"]
:oops: 那你最后需要的数据结果是:
a.areaid,a.areaname,p.propertyname
1 区域1 设施一,设施二
还是
a.areaid,a.areaname,p.propertyname
1 区域1 设施一
1 区域1 设施二
???、
不管那种方法你得先分坼字符串
sqlserver
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(100))
returns @temp table(F1 varchar(100))
as
begin
declare @ch as varchar(100)
set @SourceSql=@SourceSql+@StrSeprate
while(@SourceSql<>'')
begin
set @ch=left(@SourceSql,charindex(',',@SourceSql,1)-1)
insert @temp values(@ch)
set @SourceSql=stuff(@SourceSql,1,charindex(',',@SourceSql,1),'')
end
return
end
然后对如第二个情况
select a.areaid,a.areaname,p.propertyname
from area a,property p
where
p.propertyid in (select * from dbo.splitstr(a.propertyid,','))
对如第一个情况
一条语句就难 搞出来了。。。
[/code]