【问题标题】:Selecting rows that fail to match this join's criteria选择不符合此联接条件的行
【发布时间】:2011-09-17 17:08:29
【问题描述】:

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

我如何选择那个否定匹配?

【问题讨论】:

    标签: mysql sql join


    【解决方案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;
    

    【讨论】:

    • 严格来说,它是“一个选项”而不是“需要”。您也没有 IN 并且在其他 RDBMS 中您也可以有 EXCEPT ... :-)
    • 工程师。 . .始终专注于细节。
    【解决方案2】:

    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
        );
    

    编辑:埃文有一个观点(删除了他们的答案,这可能是你想要的)。这取决于您如何过滤蓝色。

    【讨论】:

    • 好的,但是 SELECT ev.Street Name... 不应该选择 asi.StreetName 等吗?好像在那个语法中 ev.Street Name, ev.Street Number, ev.Evaluation 一定是空的?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    • 2019-09-28
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多