我有一个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?
答案 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