我有以下查询:
SELECT *
FROM ZINVN
WHERE ZINVN.GRID IN
(
SELECT SMGRID
FROM SKU FULL JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
WHERE SKSKU=800234
);
此查询不返回结果,而如果我在没有in子句的情况下运行它,则返回预期结果。
()
内的查询也可以正常运行并返回预期结果。
我的查询中的问题在哪里?
答案 0 :(得分:3)
您应该为查询添加别名以指示列的来源。
此外,INNER JOIN将比FULL OUTER JOIN更快,因为两个原因,它不是很有意义。
1.由于行必须与左表匹配,因此使用WHERE SKU=
子句将FULL JOIN减少为LEFT JOIN
2.保留LEFT表中的记录没有任何意义,因为SMGRID
条目的IN()
将为NULL
SELECT *
FROM ZINVN
WHERE ZINVN.GRID IN
(
SELECT OTBCLS.SMGRID
FROM SKU JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
WHERE SKU.SKSKU=800234
);
当使用相关的EXISTS测试以等效形式书写时,此存在性测试通常执行得更快。
SELECT *
FROM ZINVN
WHERE EXISTS (
SELECT 1
FROM SKU JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
WHERE SKU.SKSKU=800234 AND ZINVN.GRID=OTBCLS.SMGRID
);
话虽如此,你有没有检查过额外的空格是' ZINVN.GRID'和' OTBCLS.SMGRID'?