web-dev-qa-db-ja.com

UNIONとINNER JOINを組み合わせる方法は?

次のように、ツリー内のすべてのノードの祖父母をフェッチしています。

SELECT P.id, P.parent, GP.parent gp_id FROM product_groups P             
INNER JOIN product_groups GP ON P.parent = GP.id

テーブルにはid=0のエントリはありませんが、ツリーのルートを示すparent=0のエントリがあります。これらの行は、結合する祖父母がいないため、このクエリではフェッチされません。 NULL0の両方にgp_id(またはparent)を付けて、これらの行を返してほしい。

UNIONを使用して2番目のテーブルを(0,0)で計画する予定でしたが、構文を理解できません。これを行う方法?

3
Tim

LEFT JOIN代わりに:

SELECT P.id, P.parent, GP.parent gp_id FROM product_groups P             
LEFT JOIN product_groups GP ON P.parent = GP.id

これはPからすべての行を返し、GP内の一致しない行はNULL値を持ちます。

6
JNK
SELECT P.id, P.parent, 
       GP.parent, GP.gp_id 
  FROM product_groups P             
       INNER JOIN product_groups GP
          ON P.parent = GP.id
UNION
SELECT P.id, P.parent, 
       0 AS GP.parent, 0 AS gp_id 
  FROM product_groups P
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM product_groups GP 
                    WHERE P.parent = GP.id
                  );
1
onedaywhen