问题描述
我只是想弄清楚这些语句是否相等:
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;