我有一个表中包含空值。 为了表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。
外连接生成超集了内连接。 的确,从维基百科 : 左外连接返回从内所有的值联结,加上所有的值在左边的表不匹配的右表。
所以,为了模拟左外连接使用相同的表之间的内部联接一个可以使用的内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)
据推测,你想匹配与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引擎不会使用索引的加入。
是否有一个具体的理由,为什么你不希望使用外连接? 这不是你想要的结果? :
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
因此,完整的答案应该是这样的(经过我的老师给的结果):
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