求sql

我有一张区域表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]