如何将表与存储过程中的表变量进行比较?通常比较我们使用此查询的两个表:
SELECT *
FROM Table A
WHERE NOT EXISTS(SELECT *
FROM Table B
WHERE Table A.ID = Table B.ID)
但是在这里,我有Table A
和一个表变量@Item
,如表B所示。
在这种情况下,如何比较Table A
和@Item
?
我正在编写一个存储过程,在该存储过程中,我想将现有的一个表与从前端生成的表变量进行比较,并将其作为XML数据集传递给存储过程... 在那里,如果表变量@Item中的所有行都出现在现有表中,那么它返回true,否则为false ...
请提出任何建议....
答案 0 :(得分:4)
在排除一个表的结果时,我总是更喜欢左连接语法:
select a.*
from [table] a
left outer join @item b
on a.ID = b.ID
where b.ID is null
我怀疑查询计划应该是相同的。
答案 1 :(得分:2)
如果工作原理相同(尽管使用表别名会更容易)
SELECT *
FROM Table A
WHERE NOT EXISTS(
SELECT *
FROM @Item sub
WHERE Table A.ID = sub.ID
)
答案 2 :(得分:1)
如果你正在使用子查询,你可以做同样的事情
select *
from tableA
where not in(
select b.ID
from @tableB)
@tableB
只是一个表值参数,而不是临时表。它是一个包含表格的变量,因此它可以在函数之间传递。
你也可以做类似的事情:
select *
from tableA a
left outer join @tableB b
on a.ID = b.ID
where b.ID IS NULL
答案 3 :(得分:1)
像普通表一样引用表变量:
SELECT * FROM Table A
WHERE NOT EXISTS(SELECT * FROM @ITEM WHERE Table A.ID = @ITEM.ID)
答案 4 :(得分:1)
如果要比较整个表,并且模式保证相同,则可以使用EXCEPT
。
SELECT *, 'New row' [Edit] FROM [Table A]
EXCEPT
SELECT * FROM @Item
UNION ALL
SELECT *, 'Deleted row' FROM @Item
EXCEPT
SELECT * FROM [Table A]
答案 5 :(得分:0)
您也应该使用Joins尝试下面的内容。
SELECT * FROM Table A
Left Join @Item sub on A.ID = sub.ID
Where sub.ID is Null