SQL - 使用 UNION 连接?? UNION 使用 JOIN?
Posted
技术标签:
【中文标题】SQL - 使用 UNION 连接?? UNION 使用 JOIN?【英文标题】:SQL - JOIN using UNION ?? UNION using JOIN? 【发布时间】:2011-09-29 04:50:52 【问题描述】:我在一次采访中被问到这个问题。 您可以使用 UNION 关键字进行 JOIN 吗? 你能用 JOIN 关键字做 UNION 吗?
那是—— 1. 我应该得到与 JOIN 相同的输出而不使用 JOIN 关键字,但使用 UNION 关键字? 2. 我应该得到与 UNION 相同的输出而不使用 UNION 关键字,但使用 JOIN 关键字?
如果可能的话,你能给我举个例子吗?
【问题讨论】:
你可以使用 EXISTS 和 Sub 选择来模拟内连接,但是单独使用 UNION,我不这么认为。 【参考方案1】:面试是您展示商品的框架。记住:不要回答问题;)
想想新闻发布会:发言人不想回答记者提出的难题来让自己脱颖而出。相反,他们正在寻找他们已经有答案的问题,即他们想要发布的信息(仅此而已!)
如果我在面试中遇到这个问题,我会用它来证明我对关系代数的了解,因为这就是我参加面试的目的;我对“在这里谈论关系代数”问题保持警惕,就是这样。
简单地说,JOIN 是逻辑 AND 的对应物,而 UNION 是逻辑 OR 的对应物。因此,使用约定逻辑的类似问题可能是,“你能用 OR 做 AND 吗?”和“你能用 AND 做 OR 吗?”答案将取决于您还可以使用什么,例如NOT 可能会派上用场 ;)
我也很想讨论原始运算符集、计算完整性所需的运算符集以及实际目的所需的运算符集和简写之间的区别。
试图直接回答问题会引发更多问题。 JOIN 在关系代数中意味着“自然连接”,而在 SQL 中则意味着 INNER JOIN
。如果问题具体与 SQL 有关,您是否必须回答所有 JOIN
类型? UNION JOIN
呢?
举一个例子,SQL 的外连接是著名的UNION
。 Chris Date 表达得比我想象的要好:
外连接明确设计为 在其结果中产生空值并且应该 因此,一般情况下应避免。 从关系上讲,它是一种 霰弹枪婚姻:它迫使桌子 成为一种联合——是的,我的意思是 联合,而不是连接——即使表 有问题的不符合 工会的通常要求(见 第 6 章)。它这样做,实际上, 通过填充一个或两个表 在进行联合之前使用空值, 从而使它们符合那些 毕竟通常的要求。但 没有理由为什么填充 不应该用正确的值来完成 而不是空值
SQL and Relational Theory, 1st Edition by C.J. Date
如果您想在面试中表达“我讨厌空值”,这将是一个很好的讨论点!
这些只是浮现在脑海中的一些想法。关键是,通过问这些问题,面试官为你提供了一个分支。你会在上面挂什么? ;)
【讨论】:
【参考方案2】:由于这是一个面试问题,他们正在测试您对这两个功能的理解。
他们期望的可能答案是“通常不,您不能这样做,因为他们执行不同的操作”,您可以通过说明联合将行附加到结果集的末尾作为连接来更详细地解释这一点添加更多列。
让 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
您会这样做的一种情况是,如果您在多个表上生成了数据,但您希望一起查看 ti,但是我建议在这种情况下使用 UNION 而不是 FULL OUTER JOIN,因为查询是做你所期望的。
【讨论】:
谢谢!这真的很有帮助:)【参考方案3】:你的意思是这样的吗?
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
s。
【讨论】:
哦.. 我的意思是.. 你得到 1. 与 JOIN 相同的输出而不使用 UNION ? 2. 输出和UNION一样,不用JOIN关键字?【参考方案4】:我认为这也取决于其他可用的操作。
如果我没记错的话,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
【讨论】:
加入1=0
怎么样?
@Magnus:1=0
上的完全外部连接将产生比UNION
更多的行。这些将如何被删除?
如果我没记错的话,不超过Union ALL
。
@Magnus:你说得对,它与UNION ALL
有相同的行。我什至没有考虑过UNION ALL
,因为我认为这更像是一个关系代数问题而不是现实世界的问题。以上是关于SQL - 使用 UNION 连接?? UNION 使用 JOIN?的主要内容,如果未能解决你的问题,请参考以下文章