我正在检查由25个表格中的脚本构建的搜索索引表(asIndex)。
asIndex和Evaluations表每个地址都有多行。
所以这个查询试图确保索引行的每个地方都有评估='蓝色',评估中至少有一行评估被设置为'蓝色'。 它可以工作,但它可以产生40K行。
SELECT
ev.`Street Name`,
ev.`Street Number`,
ev.Evaluation
FROM
`tblEvaluations` ev,
`asIndex` asi
WHERE asi.`Evaluation` = 'blue'
AND asi.`StreetName` = ev.`Street Name`
AND asi.`StreetNumber` = ev.`Street Number`;
我需要做的是创建一个查询,列出在asIndex中有蓝色评估的任何地址,但在评估表中没有匹配的地址,并带有蓝色评估值。
如何选择该否定匹配?
答案 0 :(得分:1)
NOT EXISTS是最干净和标准的SQL
SELECT
ev.`Street Name`,
ev.`Street Number`,
ev.Evaluation
FROM
`tblEvaluations` ev
WHERE
NOT EXISTS (SELECT * FROM `asIndex` asi
WHERE
asi.`Evaluation` = 'blue'
AND asi.`StreetName` = ev.`Street Name`
AND asi.`StreetNumber` = ev.`Street Number
);
编辑:埃文有一点(删除了他们的答案,可能是你想要的)。这取决于你如何过滤蓝色。
答案 1 :(得分:1)
您可以使用左连接。
SELECT
asi.`Street Name`,
asi.`Street Number`,
asi.Evaluation
FROM
`asIndex` asi ledt join
`tblEvaluations` ev on asi.`StreetName` = ev.`Street Name`
AND asi.`StreetNumber` = ev.`Street Number`
WHERE asi.`Evaluation` = 'blue'
AND ev.`Street Name` is Null;