2016-11-11 173 views
-3

我很難解釋這個,所以你可能會被標題弄糊塗了。 但我會在這裏盡我所能。如何用一個連接「連接」一個表格兩次?

假設我們有以下情形:

測試表

  • 測試ID
  • testtakenby(ID)
  • testrevisedby(ID)

用戶

  • 用戶ID
  • 用戶名

有沒有我能得到以下結果的方式:

「測試採取user1和通過user2的修訂後的」

無需兩次加入表格? 像這樣:

select * from tests 
inner join users on tests.testtakenby = users.userid 
inner join users on tests.testrevisedby = users.userid 

我希望有得非常好,因爲我通過加入同一個表兩次擔心的可能的性能問題的高級SQL技巧(我相信它不會與執行,以及雙連接)

+1

如果您有性能問題,您應該查找正確的索引而不是更改您的解決方案。 – Jens

+1

我不這麼認爲,爲什麼連接兩次會出現性能問題? – Ric

+0

您需要別名第二個用戶實例 - 如果這是問題 - 另一個解決方案是在select – Cato

回答

2

兩個連接應該執行得很好,沒有備用的雙連接語法

-1
select (SELECT u1.UserName FROM users u1 WHERE u1.userid = tests.testtakenby) As takenBy, 
     (SELECT u2.UserName FROM users u2 WHERE u2.userid = tests.testrevisedby) As RevisedBy 
from tests 

然而,這沒有給出性能優勢,我知道的 - 它被認爲是美學更糟 - 如果有NULL似乎沒有匹配testtakenby或testrevisedby - 在INNER JOIN中,將沒有選擇記錄

-1

爲什麼在世界上你想要阻止使用2個連接?這是正確的概念,你的SQL引擎應該儘自己的本分。

+0

因爲我不是那種SQL經驗豐富的人,而是通過向那些可能比我知道得更多的人提出問題來改善自己。 –

0

要更正您的加入(因爲你的加入會導致錯誤):

select * from tests 
inner join users Taken 
on tests.testtakenby = Taken.userid 
inner join users Revised 
on tests.testrevisedby = Revised.userid 

,沒有我想有沒有辦法加入牌桌兩次一個連接。