我有以下查询:
SELECT PKID, QuestionText, Type
FROM Questions
WHERE PKID IN (
SELECT FirstQuestion
FROM Batch
WHERE BatchNumber IN (
SELECT BatchNumber
FROM User
WHERE RandomString = '$key'
)
)
我听说子查询效率低下,并且首选联接。我找不到任何解释如何将3+层子查询转换为连接符号的内容,但是,无法理解它。
任何人都可以解释怎么做吗?
答案 0 :(得分:5)
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
关键字就足够了。
要进一步了解联接,请访问以下链接:
答案 1 :(得分: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'
答案 2 :(得分: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
子句中的那个开始。接下来,向后应用您的联接。
答案 3 :(得分: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
版本可能没问题。