使用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'
答案 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
这将选择所有已取消但没有添加的交易,包括其他可能的类型。