SQL:从具有多个键的多个表中选择

时间:2019-06-27 15:36:24

标签: sql select where-in

我有三个桌子

表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的记录

我不确定如何继续,因为我需要从三个表中选择列,而我感兴趣的键只是其中的两个。

1 个答案:

答案 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);