1

私はmysqlを使用しており、次のようなデータを含む3つのテーブルT1、T2、T3があります。

+-------+
| t1.id |
+-------+
| 1    |
| 2    |
| 3    |
| 4    |
| 5    |
+------+

+-------+
| t2.id |
+-------+
| 1    |
| 2    |
| 3    |
| 4    |
+-------+

+-------+
| t3.id |
+-------+
| 1    |
| 2    |
| 3    |
+-------+

    I want to be able to select data as follows:

id      t1.id   t2.id   t3.id
1       1       1       1
2       2       2       2
3       3       3       3
4       4       4       null
5       5       null    null

これどうやってするの?

4

3 に答える 3

2

T1base として使用するつもりであると仮定すると、 s のidペアでLEFT JOIN目的の結果が得られます。

SELECT 
  /* base id */
  T1.id AS id,
  /* Redundant t1.id */
  T1.id AS t1_id,
  T2.id AS t2_id,
  T3.id AS t3_id
FROM
  T1
  LEFT JOIN T2 ON T1.id = T2.id
  LEFT JOIN T3 ON T1.id = T3.id

これは を冗長に使用することに注意してください。ただしT1.id、それはまさに提案された出力にあるものなので、ここで複製しました。

すべてのテーブルから可能なすべての ID を取得することが本当に必要な場合は、 a を使用しUNIONて結合します。これにより、3 つのテーブルの個別の ID セットが、他の 3 つのテーブルのそれぞれに対するallidsベース ID として使用されるサブクエリに結合されます。LEFT JOIN特定の ID が存在するT2が存在しない T1場合でも、出力に表示されます。

SELECT 
  allids.id AS id,
  T1.id AS t1_id,
  T2.id AS t2_id,
  T3.id AS t3_id
FROM
  ( SELECT id FROM T1 UNION SELECT id FROM T2 UNION SELECT id FROM T3 ORDER BY id) allids
  LEFT JOIN T1 ON allids.id = T1.id
  LEFT JOIN T2 ON allids.id = T2.id
  LEFT JOIN T3 ON allids.id = T3.id
于 2012-08-16T14:26:45.147 に答える
0

あなたが望む解決策には、完全な外部結合が含まれると思います:

SELECT coalesce(t1.id, t2.id, t3.id) as id,
       T1.id as t1_id, T2.id as t2_id, T3.id as t3_id
FROM T1 full outer JOIN
     T2 ON T2.id = T1.id full outer JOIN
     T3 ON T3.id = coalesce(t1.id, t2.id)

T1 にない他の 2 つのテーブルに ID がある場合に備えて、完全な外部結合を提案します。t1 が駆動テーブルであることを指定していません。

于 2012-08-16T14:32:27.827 に答える
0
SELECT t1.id, t2.id, t3.id
FROM t1 
LEFT JOIN t2 ON t1.id=t2.id
LEFT JOIN t3 ON t1.id=t3.id

t1がすべての ID の厳密なスーパーセットを持つことが保証されている場合に機能します。

そうでない場合は、ヘルパー テーブルが必要になります。

SELECT th.id,t1.id, t2.id, t3.id
FROM (
  SELECT id FROM t1
  UNION DISTINCT 
  SELECT id FROM t2
  UNION DISTINCT 
  SELECT id FROM t3
) AS th
LEFT JOIN t1 ON th.id=t1.id
LEFT JOIN t2 ON th.id=t2.id
LEFT JOIN t3 ON th.id=t3.id
于 2012-08-16T14:28:28.297 に答える