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

时间:2018-09-06 14:40:09

标签: sql sql-server database outer-join

我有两个表customer_detailsaddress_details。我想显示客户详细信息及其对应的地址,因此我使用的是LEFT JOIN,但是当我执行此查询时,SQL Server删除了{_1}}的customer_details表与以下行不匹配的行: address_detials表中的street_no,仅显示customer_detials的“ street_no” = address_details表的street_no的行。我需要显示一个完整的customer_details表,并且如果street_no不匹配,它应该显示空字符串或其他任何内容。我在SQL连接中做错什么了吗?

street_no

customer_details

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

address_details

SQL JOIN查询:

 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   

3 个答案:

答案 0 :(得分:1)

现在,很明显,您 strptime ,我将解释其过滤原因:

LEFT JOIN本身返回一些行,这些行包含结果集中表used b.case_id=1的所有NULL值,这是您想要和期望的。

但是通过使用b,包含表WHERE b.case_id=1的NULL值的行将被滤除,因为它们都不符合条件(所有这些行都具有b,因此它们不匹配)。

使用b.case_id=NULL可能会起作用,但是我们不知道WHERE a.case_id=1a.case_id是否总是相同的值来匹配行(它们可能不是;以及它们是否相同)总是相同的,那么我们只是确定了潜在的冗余)。

有两种方法可以确定确定

(1)将b.case_id移至左侧联接条件:

b.case_id = 1

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

b

个人我会选择(1),因为这是表达要在两种条件下过滤left join address_details b on a.street_no = b.street_no where b.case_id = 1 or b.street_no IS NULL 的最清晰方法,影响正在返回的b行。

答案 1 :(得分:0)

我确实认为威廉·波根波尔(Wilhelm Poggenpohl)的回答是正确的。您只需要将上次加入条件 a .case_id = 1更改为 b .case_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

如果匹配项customer_details并且地址满足条件street_no,则该查询将显示case_id=1中的每行和相应的地址。 / p>

答案 2 :(得分:-2)

这是因为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