2013-02-22 42 views
4
SELECT * FROM dbo.Sample ORDER BY Site 

輸出:SQL排除以前在其他類別中選擇行

Site Data 
1 Cat 
1 Mule 
1 Pig 
2 Giraffe 
2 Dog 
2 Horse 
2 Mule 
4 Cat 
8 Dog 
8 Pig 
8 Mule 
8 Bull 
9 Bull 
9 Giraffe 
9 Moose 

我想顯示的網站排序的數據,但排除已經在先前的網站排。 證明不是已經在網站1所示在站點1 站點2中所有項的所有項目等

所以結果顯示爲:

Site Data 
----  ---- 
1 Cat 
1 Mule 
1 Pig 
2 Dog 
2 Giraffe 
2 Horse 
9 Moose 

初始列表是從一個查詢與建幾個加入。

的工作的例子是:

SELECT * FROM dbo.Sample WHERE Site = 1 
UNION 
SELECT * FROM dbo.Sample WHERE Site = 2 
AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 2) 
UNION 
SELECT * FROM dbo.Sample WHERE Site = 8 
AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 8) 
UNION 
SELECT * FROM dbo.Sample WHERE Site = 9 
AND Data NOT IN (SELECT Data FROM dbo.Sample WHERE Site < 9) 
ORDER BY Site 

我的網站的列表來自一個查詢也是如此。

選擇站點列表

1 
2 
4 
8 
9 

鮮明的網站想必應該有一個簡單而有效的方式來做到這一點?

回答

4

這將使您想要的結果

SELECT MIN(Site) AS Site, 
     Data 
FROM dbo.Sample 
GROUP BY Data 
ORDER BY Site 
+1

這裏有一個小提琴我爲這個... http://sqlfiddle.com/#!3/4cd0c/1 – Matt 2013-02-22 21:26:36

+0

@馬特 - 謝謝! – 2013-02-22 21:27:13

+0

甜 - 謝謝!我覺得有一個簡單的解決方案。 – kevro 2013-02-22 21:35:30

0

試試這個

SELECT min(site) 
FROM dbo.sample 
GROUP BY data 
ORDER BY 1 
4

您可以使用ROW_NUMBER

WITH CTE AS 
(
    SELECT s.*, 
     RN = ROW_NUMBER() OVER (PARTITION BY Data Order By Site) 
    FROM dbo.Sample s 
) 
SELECT * FROM CTE WHERE RN = 1 
ORDER BY Site 
+1

我修改馬特的搗鼓這個答案http://sqlfiddle.com/#!3/4cd0c/4 – 2013-02-22 21:30:02

2
SELECT * 
FROM dbo.sample a 
WHERE site = 
(SELECT min(site) 
FROM dbo.sample b 
WHERE a.data=b.data) 
order by site 

不一樣優雅作爲第一個解決方案,但這也將工作,如果喲ü最終與其他列(如顏色,例如)具有不同的價值觀,仍然只希望每個動物一行。

+1

用途[的「區段頂部」查詢優化(http://sqlblog.com/blogs/paul_white/archive/2010 /07/28/the-segment-top-query-optimisation.aspx) – 2013-02-22 21:41:59