3

null 値を含むテーブルがあります。ORDER テーブルでは、PART_ID セクションに 2 つの null があり、CUSTOMER_ID に 2 つの null 値があります。

そして、私はそのようなクエリを持っています:

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 に答える