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