2013-03-13 119 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