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指定,是因为可能存在与其他表上的多行匹配的行,导致结果出现重复记录。但是由于您只对 table 上的记录感兴趣QuestionsDISTINCT因此关键字就足够了。

要进一步了解有关联接的更多信息,请访问以下链接:

于 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子句过滤USER表,因此从FROM子句中的那个开始。接下来,向后应用您的联接。

于 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

至于inorjoin版本是否更好。. . 那要看。在某些情况下,特别是如果字段被索引,in版本可能没问题。

于 2013-02-26T14:17:17.010 回答