2016-11-11 8 views
-3

私はこれを説明するのは難しいので、タイトルによって混乱する可能性があります。 しかし、私はここで最善を尽くします。1回のジョインだけでテーブルを2回「ジョイン」する方法は?

は、我々は次のシナリオを持っていると言う:

テスト表

  • テストID
  • testtakenby(ID)
  • testrevisedby(ID)

ユーザー

  • ユーザーID
  • ユーザー名

は私が次の結果を得ることができるようにするためにそこの方法です:

"テストは、user1とuser2ので改訂によって撮影されました"テーブルに2回参加する必要はありませんか?私は二度同じテーブルに参加することによって可能にパフォーマンスの問題を心配して、私は(私はそれがAと同様に行わないと推測それは終らの高度なSQLのトリックがある願ってい

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

:このように ダブル

+1

パフォーマンス上の問題がある場合は、ソリューションを変更しない正しいインデックスを探してください。 – Jens

+1

私はそこにいるとは思っていません、なぜ2回参加することでパフォーマンスの問題が起こるのでしょうか? – Ric

+0

ユーザーの2番目のインスタンスに別名を付ける必要があります。問題がある場合は、2つのサブクエリを選択することです – Cato

答えて

2

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 

となし、私が参加し1で二回のテーブルを結合する方法はありませんね。

関連する問題