【问题标题】:SQL Inner Join query like LEFT OUTER JOINSQL Inner Join 查询,如 LEFT OUTER JOIN
【发布时间】:2015-01-10 08:50:42
【问题描述】:

我遇到了 sql 内连接的问题。我的表、列、数据类型和表值如下图所示。

我的工作查询是:

SELECT O.ORDER_ID, O.ORDER_DATE, O.QUANTITY, 
    P.PART_ID, P.PART_CODE, P.PART_NAME,
    C.CUST_ID, C.CUST_CODE, C.CUST_NAME
FROM (([dbo].[ORDER] O
LEFT OUTER JOIN [dbo].[CUSTOMER] C
    ON C.CUST_ID = O.CUST_ID)
LEFT OUTER JOIN [dbo].[PART] P
    ON P.PART_ID = O.PART_ID

它正在返回那个

所以我的问题是,我想写一个像第二张图片这样的查询,但我应该使用 INNER JOIN 这将使左外连接的工作。我为此写了以下查询

SELECT DISTINCT *
FROM [dbo].[ORDER] O 
INNER JOIN CUSTOMER C
    ON (C.CUST_ID = O.CUST_ID OR
        O.CUST_ID IS NULL)

但它不会向我返回 LEFT OUTER JOIN 查询结果。我怎样才能做到这一点不使用 LEFT OUTER JOIN ?

【问题讨论】:

    标签: sql sql-server tsql inner-join outer-join


    【解决方案1】:

    简单的答案是:您不能轻易地将左连接替换为内连接并保持相同的功能。 (你为什么要这样做?)

    左外连接允许您连接第二个表,但即使第二个表中存在不匹配,也保留第一个表的记录。另一方面,内连接会限制您的第一个表的记录,以便只显示匹配项。

    INNER JOIN CUSTOMER C ON (C.CUST_ID = O.CUST_ID OR O.CUST_ID IS NULL)
    

    你在这里部分加入表客户。当订单表包含客户时,您将相应的客户记录加入订单记录。当订单表不包含客户时,您将所有客户加入订单记录。

    当然,你总是可以欺骗。即时添加空记录:

    INNER JOIN 
    (
      SELECT CUST_ID, CUST_CODE, CUST_NAME
      FROM CUSTOMER
      UNION ALL
      SELECT NULL, NULL, NULL
    ) C ON (C.CUST_ID = O.CUST_ID OR (C.CUST_ID IS NULL AND O.CUST_ID IS NULL))
    

    但如前所述:您为什么要这样做,而不是使用 LEFT OUTER JOIN 的直接方式?

    【讨论】:

    • 我知道左外连接的工作原理,但我的老师说:“你怎么能通过内连接或其他方式完成左外连接的工作。不要使用左外连接”
    • 嗯,嗯,在我看来,这是一个奇怪的任务。但是您得到了解决方案;-) 顺便说一句,替换外部联接的另一种方法是两个选择和 UNION:select x.a, y.b from x join y on x.id=y.id UNION ALL select a, null from x where id is null。也许这就是你的老师想要的。
    【解决方案2】:

    这取决于老师的意图。如果这是一个语言问题,而不是逻辑运算符问题,请使用 OUTER APPLY:

    SELECT O.*, D.*
    FROM [dbo].[ORDER] O 
    OUTER APPLY
    (
        SELECT *
        FROM [dbo].CUSTOMER C
        WHERE C.CUST_ID = O.CUST_ID
    ) D
    

    【讨论】:

      猜你喜欢
      • 2016-10-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-10
      • 2013-05-02
      • 1970-01-01
      • 1970-01-01
      • 2010-09-29
      相关资源
      最近更新 更多