T-SQL 联合,但在不使用临时表的情况下根据另一个表排除一个表的结果?

问题描述 投票:0回答:3

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

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

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

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

sql sql-server t-sql union
3个回答
2
投票

您使用

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  

2
投票

有点不清楚您想要的最终结果是什么,但要回答您的问题是否可以在没有临时表的情况下执行此操作?是的 - 您可以这样做:

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

这将返回一个由customers1和customers2中的行组成的集合,其中customers1 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

0
投票

尝试使用

EXCEPT
关键字代替
UNION
以获得最简单的语法

 SELECT Direction,[Foo] FROM DEV1.dbo.OUTB
 EXCEPT
 SELECT Direction,[Foo] FROM UAT1.dbo.OUTB
© www.soinside.com 2019 - 2024. All rights reserved.