LEFT OUTER JOIN等效(LEFT OUTER JOIN EQUIVALENT)

2019-07-22 16:26发布

我有一个表中包含空值。 为了表I具有在PART_ID部2空和在CUSTOMER_ID 2个空值。

我有那种查询:

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

因此,这里是我的问题。 我如何能做到这一点,而无需使用外连接? 我尝试过很多事情,包括其中不存在或这一点;

SELECT *
FROM [ORDER] O ,CUSTOMER C, PART P
WHERE C.CUST_ID = (
  SELECT CUST_ID FROM CUSTOMER C WHERE O.CUST_ID = C.CUST_ID
) AND P.PART_ID = (SELECT PART_ID FROM PART P WHERE O.PART_ID = P.PART_ID) 

但我无法找到解决办法。 如果有一个解决方案将如何呢?

(注:这是家庭作业。)

我有样的表:

和左外连接给出了:

汉王说做不使用外部联接,并得到相同的表左外连接给出。 但是,像我说coulnd't。 我还使用MSSQL。

Answer 1:

外连接生成超集了内连接。 的确,从维基百科 : 左外连接返回从内所有的值联结,加上所有的值在左边的表不匹配的右表。

所以,为了模拟左外连接使用相同的表之间的内部联接一个可以使用的内UNION加入选择具有相同的连接条件,从返回的所有行,而不右表匹配第一个表中的另一个选择 (我减少你的情况为单左加入):

SELECT O.ORDER_ID , O.ORDER_DATE , O.CUST_ID, O.QUANTITY ,O.PART_ID ,
       P.PART_NAME, P.PART_CODE
FROM [ORDER] O JOIN PART P ON P.PART_ID = O.PART_ID
UNION
SELECT O.ORDER_ID , O.ORDER_DATE , O.CUST_ID, O.QUANTITY ,O.PART_ID ,
       NULL, NULL 
FROM [ORDER] O
WHERE NOT EXISTS (SELECT 'found' FROM PART P WHERE P.PART_ID = O.PART_ID)


Answer 2:

据推测,你想匹配与NULL值的列,而不是让它们失效。 如果是这样,只需修改连接条件:

FROM [ORDER] O
     LEFT OUTER JOIN PART P
     ON P.PART_ID = O.PART_ID or (p.Part_id is NULL and o.Part_id is null)
     LEFT OUTER JOIN CUSTOMER C
     ON C.CUST_ID = O.CUST_ID or (c.cust_id is null and o.cust_id is null)

这种方法的主要问题是,许多(大多数?)的SQL引擎不会使用索引的加入。



Answer 3:

是否有一个具体的理由,为什么你不希望使用外连接? 这不是你想要的结果? :

FROM [ORDER] O 
LEFT JOIN PART P 
ON P.PART_ID = O.PART_ID and P.PARTID is not null
LEFT JOIN CUSTOMER C 
ON C.CUST_ID = O.CUST_ID and C.CUSTID is not null


Answer 4:

因此,完整的答案应该是这样的(经过我的老师给的结果):

 SELECT O.ORDER_ID,O.ORDER_DATE,O.CUST_ID,
(SELECT C.CUST_CODE FROM CUSTOMER C WHERE C.CUST_ID=O.CUST_ID) AS CUST_CODE,
(SELECT C.CUST_NAME FROM CUSTOMER C WHERE C.CUST_ID=O.CUST_ID) AS CUST_NAME,
O.PART_ID,
(SELECT P.PART_CODE FROM PART P WHERE P.PART_ID = O.PART_ID ) AS PART_CODE,
(SELECT P.PART_NAME FROM PART P WHERE P.PART_ID = O.PART_ID ) AS PART_NAME,
O.QUANTITY

FROM [ORDER] O


文章来源: LEFT OUTER JOIN EQUIVALENT