我有两个表customer_details
和address_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
答案 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=1
和a.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