有兩個表(table1,table2)具有相同的列名(generation,parent),所需的輸出將是兩個表的所有列的組合。因此table2的行應該連接table1,以便table2的行與生成列上的table1的行匹配。對于table1和table2 中的條目,父編號應按升序排列。查詢結果的行數應與table1的行數相等。
鑒于下表
table1:
| generation | parent |
|:----------:|:------:|
| 0 | 1 |
| 0 | 2 |
| 0 | 3 |
| 1 | 3 |
| 1 | 2 |
| 1 | 1 |
| 2 | 2 |
| 2 | 1 |
| 2 | 3 |
表2:
| generation | parent |
|:----------:|:------:|
| 1 | 3 |
| 1 | 1 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
以下查詢用于創建和填充如上所示的兩個示例表:
create table table1(generation integer, parent integer);
insert into table1 (generation, parent) values(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(2,2),(2,1),(2,3);
create table table2(generation integer, parent integer);
insert into table2 (generation, parent) values(1,3),(1,1),(1,3),(2,1),(2,2),(2,3);
想象的查詢應導致以下預期結果:
| table1_generation | table1_parent | table2_generation | table2_parent |
|:-----------------:|:-------------:|:-----------------:|:-------------:|
| 0 | 1 | | |
| 0 | 2 | | |
| 0 | 3 | | |
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 3 |
| 1 | 3 | 1 | 3 |
| 2 | 1 | 2 | 1 |
| 2 | 2 | 2 | 2 |
| 2 | 3 | 2 | 3 |
當前查詢如下所示:
with
p as (
select
generation,
parent
from
table1
order by
generation,
parent
), o as(
select
generation,
parent
from
table2
order by
generation,
parent
)
select
p.generation as table1_generation,
p.parent as table1_parent,
o.generation as table2_generation,
o.parent as table2_parent
from
p
left join o on
o.generation=p.generation;
這導致以下結果:
| table1_generation | table1_parent | table2_generation | table2_parent |
|:-----------------:|:-------------:|:-----------------:|:-------------:|
| 0 | 1 | | |
| 0 | 2 | | |
| 0 | 3 | | |
| 1 | 1 | 1 | 1 |
| 1 | 1 | 1 | 3 |
| 1 | 1 | 1 | 3 |
| 1 | 2 | 1 | 1 |
| 1 | 2 | 1 | 3 |
| 1 | 2 | 1 | 3 |
| 1 | 3 | 1 | 1 |
| 1 | 3 | 1 | 3 |
| 1 | 3 | 1 | 3 |
| 2 | 1 | 2 | 1 |
| 2 | 1 | 2 | 2 |
| 2 | 1 | 2 | 3 |
| 2 | 2 | 2 | 1 |
| 2 | 2 | 2 | 2 |
| 2 | 2 | 2 | 3 |
| 2 | 3 | 2 | 1 |
| 2 | 3 | 2 | 2 |
| 2 | 3 | 2 | 3 |
此鏈接得出的結論是,任何連接命令可能都不是這里所必需的......但 union 只附加行......所以對我來說絕對不清楚,如何實作預期的結果 oO
任何幫助都非常感謝. 提前致謝!
uj5u.com熱心網友回復:
對這個問題的主要誤解源于您提到的連接,這是一個基于笛卡爾積的非常精確的數學定義概念,可以應用于任何兩個集合。所以電流輸出是清晰的。但是正如您在標題中所寫,您想并排放置兩個表格。您可以利用它們具有相同行數(三元組)這一事實。
此選擇回傳您想要的輸出。
我做了人工連接列, row_number() OVER (order by generation, parent) as rnum,并使用三個相加移動了第二個表。我希望這可以幫助你:
with
p as (
select
row_number() OVER (order by generation, parent) as rnum,
generation,
parent
from
table1
order by
generation,
parent
), o as(
select
row_number() OVER (order by generation, parent) as rnum,
generation,
parent
from
table2
order by
generation,
parent
)
select
p.generation as table1_generation,
p.parent as table1_parent,
o.generation as table2_generation,
o.parent as table2_parent
from
p
left join o on
o.rnum 3=p.rnum
order by 1,2,3,4;
輸出:
| table1_generation | table1_parent | table2_generation | table2_parent |
|---|---|---|---|
| 0 | 1 | (空值) | (空值) |
| 0 | 2 | (空值) | (空值) |
| 0 | 3 | (空值) | (空值) |
| 1 | 1 | 1 | 1 |
| 1 | 2 | 1 | 3 |
| 1 | 3 | 1 | 3 |
| 2 | 1 | 2 | 1 |
| 2 | 2 | 2 | 2 |
| 2 | 3 | 2 | 3 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/366697.html
標籤:PostgreSQL的 加入
