条款不起作用

时间:2013-04-24 03:54:23

标签: sql

我有以下查询:

SELECT * 
FROM ZINVN 
WHERE ZINVN.GRID IN
(
        SELECT SMGRID 
        FROM SKU FULL JOIN OTBCLS ON SKU.SKCLCD = OTBCLS.SMCLCD
        WHERE SKSKU=800234
);

此查询不返回结果,而如果我在没有in子句的情况下运行它,则返回预期结果。

()内的查询也可以正常运行并返回预期结果。

我的查询中的问题在哪里?

1 个答案:

答案 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'?