我想知道是否有办法返回部分行的副本。
IDTable设置:
ID# | Customer | EventID#
1 | Steve | 123
2 | Steve | 123
3 | John | 987
4 | John | 924
由于史蒂夫和123一起出现两次,我想把它视为一个重复的'即使他们有两个不同的ID#。如果有重复',理想情况下,我只想返回列:ID#,Customer&事件ID#。因此,对于上面的IDTable示例,只返回:
1 | Steve | 123
2 | Steve | 123
通过运行以下命令,它会分别计算每个ID + Customer + EventID#并将所有Count值返回为1(我使用SQL Server 2008):
SELECT ID#, Customer, EventID#, COUNT({fn CONCAT(Customer,EventID#)})
FROM IDTable
GROUP BY ID#, Customer, EventID#
HAVING COUNT({fn CONCAT(Customer,EventID#)}) > 1
如果我从选择中取出ID#,它会工作但我们不知道ID是什么。
编辑: 我正在加入其他表中的选择列。为了简单起见,我最初将这些问题留在了下面,当我尝试应用以下解决方案时,我感到困惑。道歉!这与我使用的内容更为一致:
SELECT A.ID#, C.Customer, E.EventID#
FROM IDTable A
INNER JOIN CustomerTable C
ON C.AccountID = A.AccountID
INNER JOIN EventTable E
ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active'
答案 0 :(得分:1)
自我加入应该做的伎俩:
scontrino
编辑您的联接:
您仍然可以使用自联接,只需使用派生表,如下所示:
SELECT A.ID#, A.Customer, A.EventID#
FROM Table A
INNER JOIN Table A2 ON A.Customer = A2.Customer
AND A.EventID# = A2.EventID#
AND A.ID# <> A2.ID#
使用SELECT A.ID#, A.Customer, A.EventID#
FROM (SELECT ID#, Customer, EventID#
FROM IDTable A
INNER JOIN CustomerTable C ON C.AccountID = A.AccountID
INNER JOIN EventTable E ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active') A
INNER JOIN (SELECT ID#, Customer, EventID#
FROM IDTable A
INNER JOIN CustomerTable C ON C.AccountID = A.AccountID
INNER JOIN EventTable E ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active') A2 ON A.Customer = A2.Customer
AND A.EventID# = A2.EventID#
AND A.ID# <> A2.ID#
更清洁:
#TEMP
答案 1 :(得分:1)
大多数版本的SQL支持窗口函数。解决这个问题最简单的方法是:
select id, customer, eventid#
from (select i.*, count(*) over (partition by customer, eventid#) as cnt
from idtable i
) i
where cnt > 1;
答案 2 :(得分:0)
SELECT i.*
FROM
IDTable i
INNER JOIN
(SELECT Customer, EventID#
FROM IDTable
GROUP BY ID#, Customer, EventID#
HAVING COUNT(*) > 1) t
ON i.Customer = t.Customer
AND i.EventId# = t.EventId#
可能还有其他方法可以做到这一点,如果你标记你的特定rdbms(sql-server,oracle,mysql等),我相信你会得到更多的答案,但这是一种方法,这是使用你的查询(没有ID列)来识别重复项,然后通过内部联接将其匹配回原始表。
答案 3 :(得分:0)
从@ Aaron_D的答案我不加入子查询,而是你可以这样做:
SELECT A.ID#, C.Customer, E.EventID#
FROM IDTable A
INNER JOIN IDTable B ON A.ID# = B.ID#
AND A.AccountID <> B.AccountID
INNER JOIN CustomerTable C
ON C.AccountID = A.AccountID
INNER JOIN EventTable E
ON E.AccountType = C.AccountType
WHERE C.StatusID = 'Active'
由于CustomerTable和EventTable都是最后一个派生自AccountID的实例,因此它可以正常工作并且速度更快。