0

3 つのテーブル間で結合を行う必要があるシナリオがあります。

表 #1 はユーザーのリストです
テーブル #2 には、特性 A を持つユーザーが含まれています
テーブル #3 には、特性 B を持つユーザーが含まれています

特性 A または特性 B を持つすべてのユーザーを (1 つの単純な sql で) 検索したい場合、行き詰まっていると思います。

通常の結合を行うと、特性 A を持っていない人は結果セットに表示されず、特性 B を持っているかどうかを確認できません (逆も同様です)。しかし、テーブル 1 からテーブル 2 および 3 への外部結合を行うと、where 句の残りの部分でテーブル 2 または 3 に対する要件を指定していても、テーブル 1 のすべての行が取得されます。

複数の SQL や一時テーブルなどを考え出す前に、このプログラムははるかに複雑です。これは単純なケースです。多くの外的要因に基づいてSQLを動的に作成するため、1つのSQLで機能させようとしています。機能する in または exists の組み合わせがあると思いますが、単純なものを望んでいました。しかし基本的に、外部結合は常にテーブル 1 からすべての結果を生成します。

4

6 に答える 6

3
SELECT *
  FROM table1
LEFT OUTER
  JOIN table2
    ON ...
LEFT OUTER
  JOIN table3
    ON ...
 WHERE NOT (table2.pk IS NULL AND table3.pk IS NULL)

または、卑劣になりたい場合:

 WHERE COALESCE(table2.pk, table3.pk) IS NOT NULL

しかし、あなたの場合、私は単に提案します:

SELECT *
  FROM table1
 WHERE table1.pk IN (SELECT fk FROM table2)
    OR table1.pk IN (SELECT fk FROM table3)

またはおそらくより効率的です:

SELECT *
  FROM table1
 WHERE table1.pk IN (SELECT fk FROM table2 UNION (SELECT fk FROM table3)
于 2009-10-15T20:44:23.713 に答える
2

どちらか一方の特性を持つユーザーのリストが本当に必要な場合は、次のようにします。

SELECT userid FROM users
  WHERE userid IN (SELECT userid FROM trait_a UNION SELECT userid FROM trait_b)

特にアウタージョインに関しては、ロングネックの答えは私が書いている最中のようです。

于 2009-10-15T20:45:34.533 に答える
1

ここで UNION を実行できると思います。

于 2009-10-15T20:44:46.500 に答える
1

提案してもいいですか:

SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table2)
UNION
SELECT columnList FROM Table1 WHERE UserID IN (SELECT UserID FROM Table3)
于 2009-10-15T20:45:04.347 に答える
1

このようなものは機能しますか?テーブルのサイズによっては、外部結合がパフォーマンスに関して非常に高くつく可能性があることに注意してください。

Select *
from table1
where userid in (Select t.userid
From table1 t
left outer join table2 t2 on t1.userid=t2.userid and t2.AttributeA is not null
left outer join table3 t3 on t1.userid=t3.userid and t3.AttributeB is not null
group by t.userid) 
于 2009-10-15T20:46:02.473 に答える
1

ユーザーのIDだけが必要な場合は、

SELECT UserId From Table2
UNION
SELECT UserId From Table3

で十分です。

これらのユーザーに関する Table1 からさらに情報が必要な場合は、上の SQL を Table 1 に結合できます。

SELECT <list of columns from Table1>
FROM Table1 Join (
    SELECT UserId From Table2
    UNION
    SELECT UserId From Table3) User on Table1.UserID = Users.UserID
于 2009-10-15T21:40:32.560 に答える