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

SQL:从同一个表连接时输出多行,sql,join,union,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.* F

我的问题是:从同一个表连接时是否可以输出多行? 以这段代码为例,我希望它输出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)

这个查询解决了我的问题。但是我的问题的答案似乎不是使用
连接
,而是使用
联合

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

你在找工会,不是加入

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

如果试图在表中乘法行,则需要UNION ALL(非UNION):

我有时也会使用交叉连接来执行此操作:

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

交叉联接显式地将行数乘以,在本例中,附加了sequencenumber。

好吧,因为它是同一个表,您可以执行以下操作:

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

这个问题的答案显然是一个联盟,而不是一个联盟。UNION删除了重复项,因此只返回一行。这假设t1和t2中的每一列都完全匹配-我假设不是这样…阅读问题。它是同一个表,有两个不同的别名。连接在ID=oldID上。这表明t1记录的“oldID”值与t2记录的“oldID”值不同。引擎仍可能尝试查找并消除重复项,如
UNION
所示,这可能会影响性能。如果您确信不存在重复项,那么最好使用
UNION-ALL
。您可以发布一些示例数据吗?如果我们能看到数据可能会更容易。
SELECT t2.*  
FROM table t1 
JOIN table t2  
  ON t2.id = t1.oldId 
  OR t2.id = t1.id
WHERE t1.id = '1'