2

私は2つのテーブルを持っています

Table A
-------
ID
ProductName

Table B
-------
ID
ProductID
Size

この2つのテーブルを結合したい

SELECT * FROM
   (SELECT * FROM A)
   LEFT JOIN
   (SELECT * FROM B)
ON A.ID = B.ProductID

これは簡単です。A からのすべての行に B で一致した行を乗算し、一致しない場合は NULL フィールドを取得します。

しかし、ここで厄介な問題が発生します。テーブル B の NULL フィールドを持つすべての行を A から取得するにはどうすればよいでしょうか。一致するものがある場合でも、NULL 値とすべての一致を含む余分な行を取得できますか?

4

3 に答える 3

4
SELECT  A.* 
,       B3.ID
,       B3.ProductID
,       B3.Size
FROM    A
LEFT JOIN
        (
        SELECT  ProductID as MatchID
        ,       ID
        ,       ProductID
        ,       Size 
        FROM    B
        UNION ALL
        SELECT  ID
        ,       null
        ,       null
        ,       null
        FROM    A A2
        ) B3
ON      A.ID = B3.MatchID

SQL Fiddle での実例。

于 2012-11-07T14:30:46.783 に答える
2

他の人が提案したようにサブクエリで使用する代わりに、外部レベルでUNION ALL使用することもできます (そして私はそうします) UNION ALL。これにより、クエリがより単純になります。

SELECT A.ID, A.ProductName, B.ID, B.Size
FROM A
INNER JOIN B
ON B.ProductID = A.ID
UNION ALL
SELECT A.ID, A.ProductName, NULL, NULL
FROM A
于 2012-11-07T14:45:39.653 に答える
1

すべての結合が成功するため、完全/内部結合に切り替えることができます。

SELECT
    *
FROM
   A
       INNER JOIN
   (SELECT ID,ProductID,Size FROM B
    UNION ALL
    SELECT NULL,ID,NULL FROM A) B
       ON
          A.ID = B.ProductID

を使用するのではなく、列に明示的に名前を付けることに切り替えるのは非常に良い時期です。SELECT *


または、@Andomarのコメントに従って、すべてのB列を次のようにする必要がある場合NULL:

SELECT
    A.ID,A.ProductName,
    B.ID,B.ProductID,B.Size
FROM
   A
       INNER JOIN
   (SELECT ID,ProductID,Size,ProductID as MatchID FROM B
    UNION ALL
    SELECT NULL,NULL,NULL,ID FROM A) B
       ON
          A.ID = B.MatchID
于 2012-11-07T14:35:08.417 に答える