选择无法匹配此联接条件的行

时间:2011-09-17 17:08:29

标签: mysql sql join

我正在检查由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中有蓝色评估的任何地址,但在评估表中没有匹配的地址,并带有蓝色评估值。

如何选择该否定匹配?

2 个答案:

答案 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;