7

次のクエリがあります。

SELECT PKID, QuestionText, Type 
FROM Questions 
WHERE PKID IN (
    SELECT FirstQuestion 
    FROM Batch 
    WHERE BatchNumber IN (
        SELECT BatchNumber 
        FROM User 
        WHERE RandomString = '$key'
    )
)

サブクエリは非効率的で、結合が好まれると聞いたことがあります。ただし、3層以上のサブクエリを結合表記に変換する方法を説明するものは何も見つかりません。

誰もそれを行う方法を説明できますか?

4

4 に答える 4

6
SELECT  DISTINCT a.*
FROM    Questions a
        INNER JOIN Batch b
            ON a.PKID = b.FirstQuestion
        INNER JOIN User c
            ON b.BatchNumber = c.BatchNumber
WHERE   c.RandomString = '$key'

指定された理由DISTINCTは、他のテーブルの複数の行に一致する行があり、結果に重複レコードが発生する可能性があるためです。ただし、テーブルのレコードのみに関心がQuestionsあるため、DISTINCTキーワードで十分です。

結合についてさらに知識を深めるには、以下のリンクにアクセスしてください。

于 2013-02-26T14:12:04.520 に答える
0

試す :

SELECT q.PKID, q.QuestionText, q.Type 
FROM Questions q
INNER JOIN Batch b ON q.PKID = b.FirstQuestion
INNER JOIN User u ON u.BatchNumber = q.BatchNumber
WHERE u.RandomString = '$key'
于 2013-02-26T14:12:45.097 に答える
0
select
    q.pkid,
    q.questiontext,
    q.type
from user u
join batch b
    on u.batchnumber = b.batchnumber
join questions q
    on b.firstquestion = q.pkid
where u.randomstring = '$key'

句はテーブルでWHEREフィルタリングされるため、句のそれから始めます。次に、結合を逆方向に適用します。USERFROM

于 2013-02-26T14:14:15.060 に答える
0

これを正しく行うdistinctには、サブクエリで必要です。それ以外の場合は、結合バージョンで行を乗算する可能性があります。

SELECT q.PKID, q.QuestionText, q.Type 
FROM Questions q join
     (select distinct FirstQuestion
      from Batch b join user u
           on b.batchnumber = u.batchnumber and
              u.RandomString = '$key'
     ) fq
     on q.pkid = fq.FirstQuestion

inまたはjoinバージョンが優れているかどうかについて。。。場合によります。場合によっては、特にフィールドにインデックスが付けられている場合は、inバージョンに問題がない可能性があります。

于 2013-02-26T14:17:17.010 に答える