2013-03-13 152 views
0

當談到SQL時,我是一個noob,所以原諒我,如果這顯而易見。 我想查找客戶字段的重複內容以及擁有它們的完整記錄。將SQL Select語句組合到單個Select語句中? (簡化。)

注:我使用MS SQL Server 2005中

我試圖實現它作爲一個單獨的SQL SELECT語句之前,我想出了以下內容:

SELECT ModTab.* from modTab 
    WHERE Customer IN (SELECT Customer 
      FROM ModTab 
      GROUP BY Customer 
      HAVING COUNT(Customer) > 1 
     ) 
    ORDER BY Customer 

本來我嘗試了十幾種不同的變體,例如:

SELECT ModTab.* 
FROM ModTab 
GROUP BY Customer,<ALL other fields...> 
HAVING COUNT(Customer) > 1 

是t這裏的東西就像是完成同樣事情的第二種方法? (加上GROUP BY子句中似乎有人毫無意義的我,我不是爲什麼它需要或使用realclear?)

+1

既然你是新的SQL,你應該學會的第一件事情就是選擇*是的您在生產代碼中沒有使用的ti模式。 – HLGEM 2013-03-13 19:11:27

+0

您使用的是什麼RDBMS? – Taryn 2013-03-13 19:11:58

+0

如果使用Sql server 2008,則嘗試CTE – 2013-03-13 19:12:46

回答

1

試試這個:

select modTab.* 
from ModTab 
join (
    select Customer, count(*) 
    from Modtab 
    group by Customer 
) B on B.Customer = ModTab.Customer 
order b Customer 

我相信這個現在還解釋了需要通過...分組。

0

如果使用支持分析函數的RDBMS(如SQLServer的),嘗試:

select * from 
(select m.*, count(*) over (partition by customer) cnt 
from Modtab m) ilq 
where cnt > 1 

否則,嘗試:

select m.* 
from Modtab m 
where exists 
(select 1 
from Modtab l 
where m.customer = l.customer and m.id <> l.id) 

(替換id與Modtab合適的主鍵字段。 )

0
WITH numbered 
AS (SELECT *, row_number() OVER (PARTITION BY customer ORDER BY customer ) AS nr FROM ModTab) 
Select * from numbered WHERE nr >1 
+0

這適用於:「WITH編號AS(SELECT row_number()over(客戶訂購)AS uid,(count(*)over(客戶分區)AS cnt,* FROM ModTab)選擇* from編號WHERE cnt> 1「但是爲什麼我不能只將cnt> 1放在內部Select語句中?!?!?!?! – NoMoreZealots 2013-03-13 20:07:02