2014-10-07 67 views
0
的联合

有一个表:SQL查询来选择属性

ID INDEX PROPERTY VALUE 
----------------------------- 
1  1  p1  v1 
2  1  p3  v3 
3  2  p2  v2 
4  2  p3  v3a 
5  3  p1  v1a 
6  3  p2  v2a 
7  3  p3  v3b 

我需要选择所有的属性,其中INDEX = 1或INDEX = 2(INDEX = 3是出intereset的)的结合。同时,PROPERTY的值应该从INDEX = 2中选择,否则从INDEX = 1开始,即我期望结果集中有3个属性:p1 = v1,p2 = v2,p3 = v3a

如何撰写SQL查询(SQL Server和Oracle)的这种任务,而不使用完整的外部联接?

回答

0

我明白了。您希望结果集中的每个Property只有一行,只有索引1和2,当有重复时优先给出2。

为此,您可以使用窗口函数:

select t.* 
from (select t.*, 
      row_number() over (partition by property order by index desc) as seqnum 
     from table t 
     where index in (1, 2) 
    ) t 
where seqnum = 1; 

你也可以做到这一点使用union all

select * 
from table t 
where index = 2 
union all 
select * 
from table t 
where index = 1 and 
     not exists (select 1 from table t2 where t2.property = t.property and t2.index = 2); 

顺便说一句,index是一列一个糟糕的名字,因为它是一个保留字。

+0

第二个查询不工作,则返回4行而不是3。 – ako 2014-10-07 11:22:15

0

添加到建议答案选择所有的属性的工会,你可以写为:预期

;with cte as 
(
    select row_number() over (partition by PROPERTY order by [INDEX] desc) 
    as rownum, 
    PROPERTY,VALUE 
    from Test 
    where [INDEX] in (1,2) 
) 
SELECT top 1 STUFF(
       (SELECT  ',' + cte1.PROPERTY + '=' + cte1.VALUE 
       FROM  cte AS cte1 
       WHERE  cte1.rownum = cte.rownum 
       FOR XML PATH('')), 1, 1, '') AS PROPERTY 

FROM cte 
where rownum = 1 

DEMO