我有一个包含空值的表。在ORDER表中,我在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)
但我找不到解决方案。如果有解决方案将如何?
(注意:这是作业。)
我有那种表:
并且左外连接给出:
hw表示不使用外连接并且获得与左外连接相同的表。但就像我说的那样。我也在使用MSSQL。
答案 0 :(得分:3)
外连接在内连接上产生超集。实际上,从Wikipedia:左外连接返回内部连接中的所有值以及左表中与右表不匹配的所有值。
因此,要使用内部联接建模左外连接,可以在具有相同连接条件的相同表和另一个 SELECT SELECT 的 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)
答案 1 :(得分:1)
据推测,您希望获得具有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引擎不会使用索引进行连接。
答案 2 :(得分:0)
您是否有特殊原因不想使用外连接?这不是你想要的结果吗? :
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
答案 3 :(得分:0)
所以完整答案应该是这样的(在我的老师给出结果之后):
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