查询不会返回任何类似'%'如果右表没有行,则运算符和左外连接

时间:2015-07-30 05:01:45

标签: sql sql-server

我正在使用 MS SQL SERVER 2008R2 。我有两张表A和B

create table A(
id int primary key, name Varchar(20));

create table B(
id int primary key, user_name Varchar(20));

insert into A values(1,'A1');
insert into A values(2,'A2');
insert into A values(3,'A3');
insert into A values(4,'A4');
insert into A values(5,'A5');

现在我的问题是:

select A.* 
from A left outer join B on A.id = B.id 
where B.user_name like '%';

select A.* 
from A left outer join B on A.id = B.id 
where B.user_name like '%%';

以上书面查询不会返回任何记录,即使左表中有5个条目。在右表上没有任何过滤器,它可以正常工作。

5 个答案:

答案 0 :(得分:4)

select A.* from A left outer join B on A.id = B.id 

这个查询会让你像这样......

id  name    id  user_name
1   A1  NULL    NULL
2   A2  NULL    NULL
3   A3  NULL    NULL
4   A4  NULL    NULL
5   A5  NULL    NULL

您正在使用与 null

相似的用户名进行比较
select A.* from A left outer join B on A.id = B.id where B.user_name like '%%';

因此它不会给你任何输出

您应该尝试以下查询

<强> select A.*,b.* from A left outer join B on A.id = B.id where (b.user_name like '%%' or b.user_name is null)

答案 1 :(得分:3)

在你的场景中...第一个左连接正在发生它正在找到5个条目,然后在该记录集上sql sever正在应用user_name的过滤器,并且所有行的user_name都是null ..没有记录显示。

您可以将查询更改为

select A.* from A left outer join B on A.id = B.id where ISNULL(B.user_name,'') like '%%';

答案 2 :(得分:3)

您正在使用通配符来比较空值, 使用此,

.logo h1 {
    text-indent: -99999px;
}

答案 3 :(得分:2)

由于表B中的所有值均为NULL,因此NULL值上的任何通配符匹配都将返回NULL

因此条件where B.user_name like '%';转换为where NULL like '%';,其值为NULL,因为NULL无法与任何值进行比较。

 select A.* from A left outer join B on 
 A.id = B.id where COALESCE(B.user_name,'') like '%%';

 select A.* from A left outer join B on 
 A.id = B.id where COALESCE(B.user_name,'') like '%';

支持sql小提琴:http://sqlfiddle.com/#!6/1ca91/8

请注意COALESCE是ANSI,因此在Oracle,SQL Server和PostGres中受支持,并进行快捷方式评估。 Ñ

  

编辑:根据新信息,此相同查询应适用于所有SQL Server,PostGres和Oracle。我正在将SQL查询更改为   使用COALESCE而不是所有

支持      

除非您使用ISNULL()并按此检查where ISNULL(B.user_name,'') like '%';

select A.* from A left outer join B on 
A.id = B.id where ISNULL(B.user_name,'') like '%%';

select A.* from A left outer join B on 
A.id = B.id where ISNULL(B.user_name,'') like '%';
     

看到这个小提琴    http://sqlfiddle.com/#!6/1ca91/6

答案 4 :(得分:0)

请尝试这个:

select A.* from A
left outer join (SELECT * FROM B where user_name like '%') X on A.id = X.id;