2012-07-16 23 views
1

我的問題是這樣的:從同一個表加入時是否可以輸出多行? 以此代碼爲例,我希望它輸出2行,每個表一個。相反,它所做的是給我1行所有的數據。SQL:當從同一個表加入時輸出多行

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

UPDATE
嗯,我有與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

+0

你可以發佈一些示例數據?如果我們能看到數據可能會更容易。 – Taryn 2012-07-16 20:58:31

回答

0

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

您正在尋找UNION,而不是JOIN。

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

這個問題的答案顯然是UNION ALL而不是UNION。 UNION刪除重複項,所以只返回一行。 – 2012-07-16 19:02:01

+0

這假設t1和t2中的每一列都完全匹配 - 我認爲不是這種情況... – 2012-07-16 19:02:58

+0

閱讀問題。這是具有兩個不同別名的同一張表。 – 2012-07-16 19:04:45

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 

交叉連接明確地將行數(在本例中)與附加的序列號相乘。

+0

閱讀問題 - t2是其中oldid = 1,而不是id = 1 – 2012-07-16 19:11:31

0

好,因爲它是在同一個表,你可以這樣做:

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