1

私の質問はこれです:同じテーブルから結合するときに複数の行を出力することは可能ですか? たとえば、このコードでは、テーブルごとに 1 行ずつ、2 行を出力したいと考えています。代わりに、すべてのデータを含む 1 行が表示されます。

SELECT t1.*, t2.* 
FROM table t1
JOIN table t2 
    ON t2.id = t1.oldId
WHERE t1.id = '1'

更新
UNION/UNION ALL で私が抱えている問題はこれです: t1.oldId 値が何に等しいかわかりません。私が知っているのはt1のIDだけです。私は2つのクエリの使用を避けようとしているので、次のようなことができる方法はありますか:

SELECT t1.*
FROM table t1
WHERE t1.id = '1'

UNION

SELECT t2.*
FROM table t2
WHERE t2.id = t1.oldId

サンプルデータ

messages_users
id    message_id   user_id   box   thread_id   latest_id
--------------------------------------------------------
8     1            1         1     NULL        NULL
9     2            1         2     NULL        16
10    2            65        1     NULL        15
11    3            65        2     2           NULL
12    3            1         1     2           NULL
13    4            1         2     2           NULL
14    4            65        1     2           NULL
15    5            65        2     2           NULL
16    6            1         1     2           NULL

Query:
SELECT mu.id FROM messages_users mu
JOIN messages_users mu2 ON mu2.latest_id IS NOT NULL
WHERE mu.user_id = '1' AND mu2.user_id = '1' AND ((mu.box = '1' 
AND mu.thread_id IS NULL AND mu.latest_id IS NULL) OR mu.id = mu2.latest_id)

このクエリは私の問題を解決します。しかし、私の質問に対する答えは、 a ではJOINなく aを使用することのようUNIONです。

4

3 に答える 3

0

テーブル内の行を乗算しようとしている場合は、UNION ALL(UNIONではなく)が必要です。

select *
from ((select * from t) union all
      (select * from t)
     ) t

また、これを行うためにクロス結合を使用することもあります。

select *
from t cross join
     (select 1 as seqnum union all select 2) vals

クロス結合は、行数を明示的に乗算します。この場合は、シーケンス番号が付加されます。

于 2012-07-16T19:01:13.053 に答える
0

t1 に 1 行、t2 に 1 行ということですか?

JOIN ではなく、UNION を探しています。

select * from table where id = 1
union
select * from table where oldid = 1
于 2012-07-16T18:57:36.240 に答える
0

同じテーブルなので、次のようにできます。

SELECT t2.*  
FROM table t1 
JOIN table t2  
  ON t2.id = t1.oldId 
  OR t2.id = t1.id
WHERE t1.id = '1'
于 2012-07-16T19:48:38.190 に答える