SQL - 使用UNION加入?? UNION使用JOIN?

时间:2011-07-05 22:45:41

标签: sql database join union

在我的一次采访中,我被问到了这个问题。 你能用UNION关键字做JOIN吗? 你能用JOIN关键字做UNION吗?

那是 - 1.我应该在不使用JOIN关键字的情况下获得与JOIN相同的输出,但使用UNION关键字? 2.我应该获得与UNION相同的输出而不使用UNION关键字,但使用JOIN关键字?

如果可能,你能给我一个如何做到这一点的例子吗?

4 个答案:

答案 0 :(得分:9)

由于这是一个面试问题,他们正在测试你对这两个功能的理解。

他们期待的可能答案是“通常不会因为执行不同的操作而无法执行此操作”,您可以通过声明联合将行附加到结果集的末尾作为连接来更详细地解释这一点。添加更多列。

您可以使用Join和Union工作的唯一方法是行只包含来自两个来源之一的数据:

SELECT A.AA, '' AS BB FROM A
UNION ALL 
SELECT '' AS AA, B.BB FROM B

与:

相同
SELECT ISNULL(A.AA, '') AS AA, ISNULL(B.BB, '') AS BB FROM A
FULL OUTER JOIN B ON 1=0

或者仅使用一个类型匹配的列来执行此操作:

SELECT A.AA AS TT FROM A
UNION ALL 
SELECT B.BB AS TT FROM B

与:

相同
SELECT ISNULL(A.AA, B.AA) AS TT
FROM A
FULL OUTER JOIN B ON 1=0

你要这样做的一种情况是,如果你有多个表生成的数据,但你想看到所有的一起,但是我建议在这种情况下使用UNION而不是FULL OUTER JOIN,因为查询是做你期望的事情。

答案 1 :(得分:9)

面试是您设置商品的框架。记住:不要回答问题;)

想想一个新闻发布会:发言人不打算回答来自journos的疑难问题。相反,他们正在寻找他们已经有答案的问题,作为他们想要发布的信息(而不是更多!)

如果我在一次采访中遇到这个问题,我会用它来证明我对关系代数的了解,因为这就是我在采访中所做的事情。我对“在这里谈论关系代数”问题保持警惕,这就是它。

松散地说,JOIN是逻辑AND的对应物,而UNION是逻辑OR的对应物。因此,使用约定逻辑的类似问题可能是,“你能做和使用OR吗?”和“你能做或使用AND吗?”答案取决于您可以使用的其他内容,例如: NOT可能会派上用场;)

我也很想讨论原始运算符集之间的差异,计算完整性所需的运算符集以及实际用途所需的运算符和短序集。

试图直接回答这个问题会引发更多问题。 JOIN意味着关系代数中的“自然连接”,而在SQL中意味着INNER JOIN。如果问题与SQL有关,那么您是否必须回答所有JOIN类型?那么UNION JOIN呢?

使用一个例子,SQL的外连接是着名的UNION。 Chris Date比我希望的更好地表达它:

  

外部联接的设计明确   在结果中产生空值并且应该   因此,一般来说应该避免。   从关系上讲,它是一种   猎枪婚姻:强迫桌子   成为一种联盟 - 是的,我的意思是   工会,不加入 - 甚至在表格时   有问题的是不符合   工会的通常要求(见   第6章)。这样做,实际上,   通过填充一个或两个表   在进行联合之前使用null   从而使它们符合那些   通常的要求毕竟。但   没有理由为什么填充   不应该使用适当的值   而不是空值

SQL and Relational Theory, 1st Edition by C.J. Date

如果“我讨厌空白”是你想在面试中得到的东西,这将是一个很好的讨论点!

这些只是想到的一些想法。关键的一点是,通过询问这些问题,面试官会为您提供一个分支机构。你会怎么样? ;)

答案 2 :(得分:1)

你的意思是这样吗?

create table Test1 (TextField nvarchar(50), NumField int)
create table Test2 (NumField int)
create table Test3 (TextField nvarchar(50), NumField int)

insert into Test1 values ('test1a', 1)
insert into Test1 values ('test1b', 2)
insert into Test2 values (1)
insert into Test3 values ('test3a', 4)
insert into Test3 values ('test3b', 5)

select Test1.*
from Test1 inner join Test2 on Test1.NumField = Test2.NumField
union
select * from Test3

(在SQL Server 2008上编写)

UNION在两个SELECT语句具有相同列数时起作用,并且列具有相同(或至少相似)的数据类型。
UNION并不关心两个SELECT语句是仅从单个表中选择数据,还是在一个或多个表中已经JOIN位于多个表上。

答案 3 :(得分:1)

我认为这也取决于其他可用的操作。

如果我记得很清楚,可以使用UNION加入来完成FULL OUTER

Table a (x, y)

Table b (x, y) 

CREATE VIEW one
AS
SELECT a.x AS Lx
     , b.x AS Rx
     , a.y AS Ly
     , b.y AS Ry
FROM a FULL OUTER JOIN b
         ON  a.x = b.x
         AND a.y = b.y


CREATE VIEW unionTheHardWay
AS
SELECT COALESCE(Lx, Rx) AS x
     , COALESCE(Ly, Ry) AS y
FROM one