sql语句是否相等?

问题描述

我只是想弄清楚这些语句是否相等:

SELECT *
FROM houses LEFT JOIN tenants on houses.id= tenants.id
WHERE houses.id = 005 and tenants.address = '1 chavvy road'

SELECT *
FROM houses LEFT JOIN tenants on houses.id= tenants.id and tenants.address='1 chavvy road'
WHERE houses.id = 005

我创建了一个虚拟数据库,看起来它们是等效的。当这些都不相等时,谁能想到一个例子?

我的理解是,这些语句基本上给出相同的结果。在我看来,代码1在联接之后对租户地址进行过滤,而代码2在联接内进行过滤。

解决方法

如果它是INNER JOIN,则查询将是等效的。但是由于这是LEFT JOIN,所以不是。假设tenants持有元组id: 005,address: 'bla'。第一个查询检查ID是否匹配,执行连接,然后查看地址不匹配,并省略该行。第二个查询不加入,因为地址不匹配,但不会省略该行,而是为NULL的所有列返回tenants

WITH houses (id) AS (
    SELECT *
    FROM (VALUES (5)) as a
),tenants (id,address) AS (
    SELECT *
    FROM (VALUES (5,'bla')
         ) as tenants
)
SELECT *
FROM houses LEFT JOIN tenants ON houses.id = tenants.id
WHERE houses.id = 005 and tenants.address = '1 chavvy road';

WITH houses (id) AS (
    SELECT *
    FROM (VALUES (5)) as a
),'bla')
         ) as tenants
)
SELECT *
FROM houses LEFT JOIN tenants ON houses.id = tenants.id and tenants.address = '1 chavvy road'
WHERE houses.id = 005;

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...