【问题标题】:How do I write a subquery using a JOIN in SQL如何在 SQL 中使用 JOIN 编写子查询
【发布时间】:2015-12-02 22:43:21
【问题描述】:

我有以下代码来检索和显示同时也是编辑的作者的名字和姓氏 (ED_ID = WRT_ID)。

SELECT Writers.WRT_LastName AS LastName, Writers.WRT_FirstName AS FirstName
FROM Writers INNER JOIN Editors ON Editors.ED_ID = Writers.WRT_ID;

它会产生我想要的结果,但我如何使用子查询编写它并产生相同的结果?

我正在使用 Access 2013

如果我需要提供更多信息,请告诉我。

【问题讨论】:

    标签: sql ms-access subquery


    【解决方案1】:

    大概,您不想要重复的结果。我指出这一点,因为如果Editors 表有重复,子查询将不同于join

    典型的写法是使用INEXISTS。我倾向于使用后者,尽管两者在性能方面通常相当相似(另一方面,NOT EXISTS 在语义上优于 NOT IN)。

    SELECT Writers.WRT_LastName AS LastName, Writers.WRT_FirstName AS FirstName
    FROM Writers 
    WHERE EXISTS (SELECT 1 FROM Editors WHERE Editors.ED_ID = Writers.WRT_ID);
    

    【讨论】:

    • 所以如果一个表有重复,我应该使用 EXISTS 而不是 IN?
    • SELECT 1 在子查询中做了什么?
    • @Ddrossi93 。 . . EXISTS 只是检查是否存在一行。 1 是任意的。 EXISTSIN 做同样的事情。如果Editors 中有重复的写入者,JOIN 可以产生重复。 WHERE 子句中的条件不会重复结果,因此结果集并不总是相同的。
    【解决方案2】:

    您只需将连接条件放入 where 子句子查询中:

    SELECT WRT_LastName as LastName, WRT_FirstName as FirstName
    FROM   WRITERS
    WHERE  WRT_ID in (SELECT ED_ID FROM EDITORS)
    

    【讨论】:

    • 那行得通。谢谢你。用子查询替换 JOIN 时总是这样吗?
    • 是的。您只需要匹配逻辑即可。在连接查询中,您使用连接从 WRITERS 表中过滤掉在 EDITORS 表中没有匹配 ED_ID 的 WRT_ID。将相同的逻辑转移到 where 子句,您就有了子查询版本。
    • 太棒了。非常感谢。
    • 这是一本很好的读物stackoverflow.com/questions/2577174/join-vs-sub-query,它触及了 Gordon 上面提到的内容(子查询自然会过滤掉重复项,连接不会),并且有一些关于性能优缺点的有趣信息。跨度>
    猜你喜欢
    • 2011-08-06
    • 2010-09-24
    • 2012-05-16
    • 2020-10-04
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2022-09-18
    相关资源
    最近更新 更多