我有三个桌子
表A
| id1 | code |
|-----|------|
| 201 | CLA0 |
| 3 | CQS2 |
| 393 | WQS1 |
表B
| id1 | id2 | name |
|-----|-----|------|
| 201 | 44 | pluto|
| 3 | 201 | pippo|
| 393 | 67 | pluto|
| 701 | 444 | pappa|
表C
| id2 | area |
|-----|------|
| 44 | 5 |
| 201 | 5 |
| 67 | 10 |
| 444 | 1 |
所有记录都有一个不同的id1和一个不同的id2(键)。
记录可能有也可能没有代码
记录可能有也可能没有区域
面积值是1、5和10
我想要这个表(记录的完整列表,包括ID2,名称和代码-如果有的话):
| id2 | name | code |
|-----|------|------|
| 44 | pippo| CLA0 |
| 201 | pappa| |
即我需要
1)从表B中选择列“ id2”和“名称”
2)如果A和B上的“ id2”相同,则还从表A中选择“代码”。如果在表B中id2不可用,则列出具有空代码值的id2
3)仅显示面积= 5的记录
我不确定如何继续,因为我需要从三个表中选择列,而我感兴趣的键只是其中的两个。
答案 0 :(得分:0)
我认为这只是常规联接和带有过滤的外部联接:
select b.id2, b.name, c.code
from b join
c
on b.id2 = c.id2 left join
a
on b.id1 = c.id1
where c.area = 5;
因为c
中有重复项,所以exists
更好:
select b.id2, b.name, c.code
from c left join
a
on b.id1 = c.id1
where exists (select 1 from c where c.id2 = b.id2 and c.area = 5);