2013-08-19 109 views
0

假設我有一個表(關係),如如何爲這種情況編寫sql?

MyTab(ID1,ID2,IsMarked, data,....) 

樣本數據可能看起來像:

1, 1, 1, ... 
1, 2, 0, ... 
1, 3, 0, ... 

2, 34, 1, ... 

3, 4, 0, ... 

4, 546, 0, ... 
4, 8, 0, ... 

只有一個可以被標記爲每個ID1。我想爲所有實體ID1獲取標記爲1的數據。如果沒有標記的記錄,請獲取第一個或其中任何一個。

對於上面的樣本數據,結果應該是:

1, 1, 1, ... 

2, 34, 1, ... 

3, 4, 0, ... 

4, 546, 0, ... 

聯盟可能是一個解決方案,但過長,可能會導致糟糕的表現。 我的想法是按ID1IsMarked desc排序數據,每個ID1獲得第一個1,但是如何爲這種情況編寫SQL

+3

*如果沒有makred記錄,獲得第一個*,你如何訂購這些行?,你怎麼知道哪一行是第一行? – Lamak

+0

相同的ID1是否可以有多個IsMarked集?例如。可以將數據看作1,1,1 ... 1,2,1 ... –

回答

0

瞎猜:

SELECT A.* 
FROM MYTAB A 
    LEFT JOIN (
     SELECT MAX(ID2) AS MAXID2, ID1 
      FROM MYTAB 
       WHERE ISMARKED=1 
        GROUP BY ID1 
    ) B ON A.ID2=B.MAXID2 AND A.ID1=B.ID1 
     LEFT JOIN (
      SELECT MAX(ID2) AS MAXID2, ID1 
       FROM MYTAB 
        WHERE ISMARKED=0 
         GROUP BY ID1 
     ) C ON A.ID2=C.MAXID2 AND A.ID1=C.ID1 
      WHERE 
       (B.ID1 IS NOT NULL) 
       OR 
       (B.ID1 IS NULL AND C.ID1 IS NOT NULL); 
3

對於只有一個可以被標記爲每個ID1下面應該工作:

;with cte as (
    select *, rn=row_number() over (partition by ID1 order by IsMarked desc) 
) 
select * 
from cte 
where rn=1