0

この UNION を単純化して、結合されるクエリのほぼ冗長性を回避することは可能ですか? ここに見られるように、両方のクエリは似ています。table2 の別の列に参加するだけです。同じクエリで Inner Joining 2x の代わりに Union を使用する理由は、このクエリがサブクエリとして使用されるという事実により、結果が 1 列にある必要があるためです。

SELECT t1.id as id
FROM table1 g
INNER JOIN table2 t1 on g.t_id = t1.id
WHERE g.id=1
UNION
SELECT t2.id as id2
FROM table1 g
INNER JOIN table2 t2 on g.t2_id = t2.id
WHERE g.id=1
4

3 に答える 3

2

これが、2 つの述語のいずれかの一致によって満たされる単純な内部結合として扱われなかった理由がわかりません。わかりやすくするために、t1、t2、および g の元のテーブル エイリアスを削除しました。クエリが重複する行を生成する可能性があるかどうかわからないので、元のクエリで UNION が行ったのと同じ方法で、重複する行を折りたたむために DISTINCT を使用しました。

SELECT DISTINCT table2.id
FROM table1
INNER JOIN table2
ON ( table1.t_id = table2.id OR table1.t2_id = table2.id )
WHERE table1.id = 1
;
于 2012-09-09T04:12:47.657 に答える
1

これはもっと簡単だと思うかもしれません:

select distinct t.id
from table2 t
where t.id in (select g.t_id from table1 g) or
      t.id in (select g.t2_id from table1 g)

ただし、MySQL ではパフォーマンスが大幅に低下します。次のこともできます。

select distinct t.id
from table2 t
where exists (select 1 from table1 g where g.t_id = t.id or g.t2_id = t.id)

2 番目のバージョンは、MySQL でより適切に動作するはずです。

于 2012-09-08T22:23:20.027 に答える
1

2 つの結合と IFNULL() 関数で行うことができます。

SELECT IFNULL (t1.id, t2.id) as id
FROM table1 g
INNER JOIN table2 t1 on g.t_id = t1.id
INNER JOIN table2 t2 on g.t2_id = t2.id
WHERE g.id=1
于 2012-09-08T21:53:48.413 に答える