连接查询,SQL Server正在删除我的第一个表的一些行

连接查询,SQL Server正在删除我的第一个表的一些行,sql,sql-server,database,outer-join,Sql,Sql Server,Database,Outer Join,我有两个表customer\u details和address\u details。我想显示客户的详细信息及其相应的地址,所以我使用了左连接,但当我执行此查询时,SQL Server删除客户详细信息表的street\u no与地址详细信息表中的street\u no不匹配的行,并仅显示客户详细信息的“street\u no”=地址详细信息表中的street\u no的行。我需要显示一个完整的customer_details表,如果street_no不匹配,它应该显示空字符串或任何内容。我在SQL

我有两个表
customer\u details
address\u details
。我想显示客户的详细信息及其相应的地址,所以我使用了
左连接
,但当我执行此查询时,SQL Server删除客户详细信息表的
street\u no
与地址详细信息表中的street\u no不匹配的行,并仅显示客户详细信息的“street\u no”=地址详细信息表中的street\u no的行。我需要显示一个完整的customer_details表,如果street_no不匹配,它应该显示空字符串或任何内容。我在SQL连接中是否做错了什么

客户详细信息

case_id customer_name  mob_no       street_no
-------------------------------------------------
 1           John      242342343    4324234234234
 1           Rohan     343233333    43332
 1           Ankit     234234233    2342332423433
 1           Suresh    234234324    2342342342342
 1           Ranjeet   343424323    32233
 1           Ramu      234234333    2342342342343
 s_no   streen_no       address        city    case_id
 ------------------------------------------------------
  1     4324234234234   Roni road      Delhi    1
  2     2342332423433   Natan street   Lucknow  1
  3     2342342342342   Koliko road    Herdoi   1   
地址\u详细信息

case_id customer_name  mob_no       street_no
-------------------------------------------------
 1           John      242342343    4324234234234
 1           Rohan     343233333    43332
 1           Ankit     234234233    2342332423433
 1           Suresh    234234324    2342342342342
 1           Ranjeet   343424323    32233
 1           Ramu      234234333    2342342342343
 s_no   streen_no       address        city    case_id
 ------------------------------------------------------
  1     4324234234234   Roni road      Delhi    1
  2     2342332423433   Natan street   Lucknow  1
  3     2342342342342   Koliko road    Herdoi   1   
SQL联接查询:

select  
    a.*, b.address 
from 
    customer_details  a 
left join 
    address_details b on a.street_no = b.street_no 
where 
    b.case_id = 1 

这是因为where子句。试试这个:

select  a.* , b.address 
from customer_details  a 
  left join address_details b on a.street_no=b.street_no 
and a.case_id=1

我认为威廉·波根波尔的回答是对的。您只需要将最后一个连接条件a.case\u id=1更改为b.case\u id=1

select  a.* , b.address 
from customer_details  a 
  left join address_details b on a.street_no=b.street_no 
  and b.case_id=1

此查询将显示
客户详细信息
中的每一行以及相应的地址,如果有匹配的
街道号
,并且地址满足条件
案例id=1

,现在很清楚您
使用了b.case\u id=1
,我将解释为什么它会过滤:

左连接本身返回一些行,这些行包含结果集中表
b
的所有空值,这是您想要和期望的

但是通过使用
其中b.case\u id=1
,包含表
b
的空值的行将被过滤掉,因为它们都不匹配条件(所有这些行都具有
b.case\u id=NULL
,因此它们不匹配)

在a.case\u id=1的情况下使用
可能会起作用,但我们不知道
a.case\u id
b.case\u id
对于匹配行是否总是相同的值(它们可能不是;如果它们总是相同,那么我们只是确定了一个潜在的冗余)

有两种方法可以肯定地解决此问题

(1) 将
b.case_id=1
移动到左连接条件:

left join address_details b on a.street_no = b.street_no and b.case_id = 1
(2) 将
b.case_id=1
保留在WHERE中,但也允许为空
b
值:

left join address_details b on a.street_no = b.street_no 
where b.case_id = 1
or    b.street_no IS NULL

就我个人而言,我会选择(1),因为这是表达您希望在两个条件下过滤
b
,而不影响返回的
a
行的最清晰方式。

客户详情?斯特里诺?请发布实际代码,这只会给出语法错误,然后是
address
vs
address
您确定这是完整的WHERE子句吗,或者可能还有一部分
和B.SomeField=someValue
?我无法让sqlfiddle.com正常工作,所以我在本地SQL Server 2017上测试了这一点-显然是猜测数据类型等-您的查询对我来说很好:我返回了六行,其中三行的地址为空。下面是我测试的SQL:为什么会有不同?如果你使用where…然后它首先过滤表,如果你使用and…,那么它将成为连接的一部分实际上这不会产生相同的结果。这将返回customer_details中的每一行,而不仅仅是case_id=1的行。这不是OP想要的解决方案。@SeanLange D'oh,是的,你说得对。所以这更糟。