Sql 如何做一个正确的看法?
我这里有两张桌子:Sql 如何做一个正确的看法?,sql,postgresql,join,Sql,Postgresql,Join,我这里有两张桌子: Table1 Version | Position | PIN 1 | 1 | 1111 1 | 2 | 2222 2 | 1 | 3333 2 | 2 | 4444 我还有一张桌子 Table2 Name | Version | Position1 | Position2 'Phone1' | 1 | A | B 'Phone2' |
Table1
Version | Position | PIN
1 | 1 | 1111
1 | 2 | 2222
2 | 1 | 3333
2 | 2 | 4444
我还有一张桌子
Table2
Name | Version | Position1 | Position2
'Phone1' | 1 | A | B
'Phone2' | 2 | C | D
实际上,表2.Position1=(表1.Position=1)和表2.Position2=(表1.Position=2)。另外,Table1.Version=Table2.Version
我想提出这样的观点
Table3
Name | P_Name | PIN
'Phone1' | A | 1111
'Phone1' | B | 2222
'Phone2' | C | 3333
'Phone2' | D | 4444
我认为最优雅和可扩展的方法是:
with cte(Name, Version, P_Name, Position) as (
select Name, Version, Position1, 1 from Table2
union all
select Name, Version, Position2, 2 from Table2
)
select
T2.Name, T2.P_Name, T1.PIN
from Table1 as T1
left outer join cte as T2 on
T2.Position = T1.Position and T2.Version = T1.Version
order by Name, P_Name
您可以轻松地添加position=3、4,然后只需在cte中添加行即可编辑:
输出:
| NAME | POS | PIN |
|--------|-----|------|
| Phone1 | A | 1111 |
| Phone1 | B | 2222 |
| Phone2 | C | 3333 |
| Phone2 | D | 4444 |
| NAME | POSITION | PIN |
|--------|----------|------|
| Phone1 | 1 | 1111 |
| Phone1 | 2 | 2222 |
| Phone2 | 1 | 3333 |
| Phone2 | 2 | 4444 |
看见
早期的 您可以使用以下方式进行连接:
SELECT t2."Name", t1."Position", t1."PIN"
FROM Table1 AS t1
JOIN Table2 AS t2
ON t1."Version" = t2."Version"
AND ( (t1."Position" = 1 AND t2."Position1" = t1."PIN")
OR (t1."Position" = 2 AND t2."Position2" = t1."PIN")
)
输出:
| NAME | POS | PIN |
|--------|-----|------|
| Phone1 | A | 1111 |
| Phone1 | B | 2222 |
| Phone2 | C | 3333 |
| Phone2 | D | 4444 |
| NAME | POSITION | PIN |
|--------|----------|------|
| Phone1 | 1 | 1111 |
| Phone1 | 2 | 2222 |
| Phone2 | 1 | 3333 |
| Phone2 | 2 | 4444 |
看见