3

我有一个表包含空值。在 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 

所以这是我的问题。我怎么能不使用外连接呢?我尝试了太多东西,包括 where not exists 或 this ;

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) 

但我找不到解决方案。如果有解决方案会怎样?

(注:这是作业。)

我有那种桌子:

在此处输入图像描述

左外连接给出:

在此处输入图像描述

硬件说不使用外连接并获得与左外连接相同的表。但就像我说的那样,我不能。我也在使用 MSSQL。

4

4 回答 4

3

外连接产生超集而不是内连接。事实上,来自维基百科左外连接返回内连接的所有值加上左表中与右表不匹配的所有值。

因此,要使用内连接对左外连接进行建模,可以在具有相同连接条件的相同表之间使用内连接SELECT的UNION以及来自第一个表的另一个SELECT,该表返回右表中没有匹配的所有行(我将您的情况减少到一个左加入):

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)
于 2013-03-22T14:42:46.070 回答
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 引擎不会使用索引进行连接。

于 2013-03-22T14:10:31.130 回答
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
于 2013-03-22T14:14:40.527 回答
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
于 2013-03-31T12:15:25.517 回答