将外键枢转到行

时间:2018-08-05 16:19:58

标签: sql

我需要将两个表连接在一起,但我希望它们返回带有“标签”列的行,而不是它们只是同一条记录。

我有这样的设置:

create table main_record(
  id int not null primary key,
  foo_entry_id int not null,
  bar_entry_id int not null
);

create table entry (
  id int not null primary key,
  entry_value varchar(255) not null
);

insert into entry values (1, 'foo');
insert into entry values (2, 'bar');

insert into main_record values (1, 1, 2);

select
    case when e1.id is null then 'should be foo'
    else 'should be bar' end as a_label,
    e1.id as foo_id,
    e2.id as bar_id
from main_record mr
left join entry e1 on mr.foo_entry_id = e1.id
left join entry e2 on mr.bar_entry_id = e2.id;

我只得到一份记录:

+ ------------- + ----------- + ----------- +
| a_label       | foo_id      | bar_id      |
+ ------------- + ----------- + ----------- +
| should be bar | 1           | 2           |
+ ------------- + ----------- + ----------- +

我需要这样的地方:

+ ------------- + ----------- + ----------- +
| a_label       | foo_id      | bar_id      |
+ ------------- + ----------- + ----------- +
| should be foo | 1           | NULL        |
+ ------------- + ----------- + ----------- +
| should be bar | NULL        | 2           |
+ ------------- + ----------- + ----------- +

编辑

我目前正在使用UNION来执行此操作,但出于篇幅的原因,我将其余部分省略。我试图避免使用UNION,所以我可以对较大查询的一部分进行此操作。

1 个答案:

答案 0 :(得分:0)

分别进行两个JOIN并将结果与​​UNION一起添加

select
   'should be foo'  a_label,
     e.id  foo_id,
     null  bar_id
from main_record mr
left join entry e
on mr.foo_entry_id = e.id
union
select
   'should be bar',
     null, 
     e.id   
from main_record mr
left join entry e
on mr.bar_entry_id = e.id