1

我在一个表中有一些实体,在另一个中有它们的属性和值。我想创建一个选择,我可以在其中看到每个实体的特定属性的值,如果该属性缺失,则为 null。如何使用标准 SQL 做到这一点?

这是设置:

create table person (id int not null, nick varchar(32) not null);

insert into person (id, nick) values (1, 'John');
insert into person (id, nick) values (2, 'Peter');

create table req_attributes (name varchar(32));

create table person_attributes (id int not null, 
                                person_id int not null,
                                attribute varchar(32) not null,
                                value varchar(64) not null);

insert into person_attributes values (1, 1, 'age', '21');
insert into person_attributes values (2, 1, 'hair', 'brown');
insert into person_attributes values (3, 2, 'age', '32');
insert into person_attributes values (4, 2, 'music', 'jazz');

这是我当前的选择语句:

select * from person join person_attributes on 
  person.id = person_attributes.person_id
  where attribute = 'hair';

显然彼得不在结果集中,因为我们没有关于他头发的信息。我也想让他进入结果集,但值为空。

如果结果集像

Person, Hair color
John,   brown
Peter,  null

如果可能的话,我想避免子查询,但如果不可能使用连接,那么他们是受欢迎的。

4

1 回答 1

1

外部联接将执行此操作:

select p.*, pa.value
from person p
  left join person_attributes pa
         on p.id = pa.person_id
        and pa.attribute = 'hair';

请注意,“外部连接”表的条件需要进入JOIN子句,而不是 where 子句。如果条件在where子句中,它将有效地将外连接变为内连接。这是因为pa.attribute由于外部连接,它将为空,并且where不会匹配空值,从而消除了所有应该实际保留在结果中的行。

SQFiddle 基于您的示例:http ://sqlfiddle.com/#!12/d0342/1

于 2013-08-24T09:55:13.230 回答