SQL内部联接查询,如LEFT OUTER JOIN

时间:2014-11-13 09:07:49

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

我有一个sql内连接问题。我的表格,列,数据类型和表格值如下图所示。

enter image description here

我的工作查询是:

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

它正在返回 enter image description here

所以我的问题是,我想编写一个像第二张图片的查询,但我应该使用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?

2 个答案:

答案 0 :(得分:1)

简单的答案是:您无法轻松地将内部联接替换为左联接并保持相同的功能。 (你为什么要这样?)

左外连接允许您加入第二个表,但即使存在第二个表中的不匹配,也要保留第一个表的记录。另一方面,内部联接限制了第一个表的记录,以便显示仅匹配

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

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

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

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的直接方式呢?

答案 1 :(得分:0)

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

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