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 |
看见