SQL:从同一表连接时输出多行

时间:2012-07-16 18:56:34

标签: sql join union

我的问题是:从同一个表加入时是否可以输出多行? 以这个代码为例,我希望它输出2行,每个表一个。相反,它的作用是给我一行所有数据。

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)

此查询修复了我的问题。但似乎我的问题的答案是不使用JOIN而是使用UNION

3 个答案:

答案 0 :(得分:0)

你的意思是t1的一行和t2的一行?

你正在寻找UNION,而不是JOIN。

select * from table where id = 1
union
select * from table where oldid = 1

答案 1 :(得分: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

交叉连接明确地将行数乘以(在这种情况下)附加的序列号。

答案 2 :(得分:0)

好吧,因为它是同一张桌子,你可以这样做:

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