【问题标题】:Where vs AND in LEFT JOIN [duplicate]在哪里 vs AND 在 LEFT JOIN [重复]
【发布时间】:2014-12-17 15:46:32
【问题描述】:

在执行LEFT JOIN 时,我通常不会在与ON 相同的行中使用AND,因为我过去曾遇到过问题。我宁愿不进入这个泡菜,而是在WHERE 子句中添加任何附加条件,这是可靠的。但是今天,出于好奇,我很想提出这个问题,并一劳永逸地弄清楚。

问题:当我使用“exta”条件时,LEFT JOIN 中到底发生了什么?为什么它的行为方式与WHERE 不同?

示例查询

create table #a
(
id int,
name varchar(3)
)


create table #b
(
id int,
name varchar(3)
)

insert into #a
select 1, 'abc'
union
select 2, 'def'
union
select 3, 'ghi'


insert into #b
select 1, 'abc'
union
select 2, 'def'

select * from #a a left join #b b on a.id = b.id 
where a.id = 3

select * from #a a left join #b b on a.id = b.id 
and a.id = 3

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    此版本过滤a.id:

    select *
    from #a a left join
         #b b
         on a.id = b.id 
    where a.id = 3
    

    此版本不过滤a.id

    select *
    from #a a left join
         #b b
         on a.id = b.id and a.id = 3;
    

    为什么不呢?转到left join 的定义。无论on 子句的计算结果是真、假还是NULL,它都会从第一个表中取出所有行。因此,第一个表上的过滤器对 left join 没有影响。

    第一个表上的过滤器应该在where 子句中。第二个表上的过滤器应该在on 子句中。

    【讨论】:

      【解决方案2】:

      您可以在 ON 子句中对“右表”列设置条件。

      【讨论】:

      • 条件在左表。
      • 这是一个笼统的答案,可能不适合示例查询。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多