如何在TSQL中查找不成对的行?

时间:2016-04-14 13:15:13

标签: sql-server tsql inner-join except

使用2008 R2。

我的表应该包含一些配对的行 - 一个取消事务和一个添加事务,但是我们有一些不好的数据,其中只有一个取消。

我试图识别这些并消除它们。我尝试了以下代码,但SQL返回了错误"所有使用UNION,INTERSECT或EXCEPT运算符组合的查询必须在其目标列表中具有相同数量的表达式。"

如何识别这些不匹配的行?

select *
from dbo.mytable t
where typename = 'Cancel'
except
Select *
from dbo.mytable t1 
inner join dbo.mytable t2
    on t1.id = t2.id
where t1.typename = 'Cancel'
and t2.typename = 'Add'

3 个答案:

答案 0 :(得分:2)

您必须在选择列表中指定id字段:

SELECT id
FROM mytable
WHERE typename = 'Cancel'

EXCEPT

SELECT id
FROM mytable
WHERE typename = 'Add'

上述查询选择了id值,其中包含不匹配的'取消'记录存在。

或者,您可以使用LEFT JOIN

SELECT t1.id
FROM mytable t1
LEFT JOIN mytable t2 ON t1.id = t2.id AND t2.typename = 'Add'
WHERE t1.typename = 'Cancel' AND t2.id IS NULL

答案 1 :(得分:1)

试试这个:

select id
from dbo.mytable t
where typename = 'Cancel'
except
Select id
from dbo.mytable t1 
inner join dbo.mytable t2
    on t1.id = t2.id
where t1.typename = 'Cancel'
and t2.typename = 'Add'

答案 2 :(得分:0)

SELECT  *
FROM    (
        SELECT  *,
                SUM(CASE typename WHEN 'add' THEN 1 END) OVER (PARTITION BY id) addcnt,
                SUM(CASE typename WHEN 'cancel' THEN 1 END) OVER (PARTITION BY id) cancelcnt
        FROM    mytable
        ) q
WHERE   addcnt IS NULL
        AND cancelcnt > 0

这将选择所有已取消但没有添加的交易,包括其他可能的类型。