将SQL Select语句组合到单个Select语句中? (简化。)
问题描述:
当谈到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?)
答
试试这个:
select modTab.*
from ModTab
join (
select Customer, count(*)
from Modtab
group by Customer
) B on B.Customer = ModTab.Customer
order b Customer
我相信这个现在还解释了需要通过...分组。
答
如果使用支持分析函数的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合适的主键字段。 )
答
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
既然你是新的SQL,你应该学会的第一件事情就是选择*是的您在生产代码中没有使用的ti模式。 – HLGEM 2013-03-13 19:11:27
您使用的是什么RDBMS? – Taryn 2013-03-13 19:11:58
如果使用Sql server 2008,则尝试CTE – 2013-03-13 19:12:46