T-SQL Union,但是在不使用临时表的情况下从一个表中排除基于另一个表的结果?

时间:2014-10-29 23:29:11

标签: sql sql-server tsql union

我正在寻找UNION两个select语句,但如果第一个select包含某些记录而不使用临时表,则第二个选择会排除某些结果

我正在努力实现这样的目标:

select customernumber, name into #tempCustomer1 from customers1

select customernumber, name from #tempCustomer1 
UNION
select customernumber, name from customers2 
where customernumber not in (select customernumber from #tempCustomer1)

order by customernumber

是否可以在没有临时表的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

有点不清楚你想要的最终结果是什么,但回答你的问题是否可以在没有临时表的情况下这样做?是的 - 你可以这样做:< / p>

select customernumber, name from customers1
UNION
(
select customernumber, name from customers2 
where customernumber not in (select customernumber from customers1)
) 
order by customernumber

这将返回一个由customers1和customers2中的行组成的集合,其中customer1 ID已从customers2中删除,我认为这就是您想要的。

如果你想摆脱重复的行,这是由UNION完成的,因为你没有为它添加ALL选项。

使用此测试设置:

declare @customers1 table (customernumber int, name char)
declare @customers2 table (customernumber int, name char)

insert @customers1 values (1,'a'),(2,'b')
insert @customers2 values (3,'d'),(4,'e'),(1,'f')

select customernumber, name from @customers1 
UNION
(
select customernumber, name from @customers2 
where customernumber not in (select customernumber from @customers1)
) 
order by customernumber

输出结果为:

customernumber  name
1   a
2   b
3   d
4   e

答案 1 :(得分:1)

您使用UNION的查询应该正是您想要的,因为Union会从结果集中丢弃重复的行。所以,你可以说

select customernumber, name from customers1

UNION

select customernumber, name from customers2

根据您的评论,您可以使用内联查询来实现相同的操作,而无需使用像

这样的临时表
SELECT * FROM
(
select customernumber, name from customers1

UNION

select customernumber, name from customers2
) tab
WHERE customernumber NOT IN (select customernumber from customers1)
ORDER BY customernumber