Postgresql: aynı sütun adlarına sahip iki tabloyu sorgulayın ve sonucu her iki tabloda da bulunan sütun adlarını yan yana sıralayarak gösterin

0

Soru

Aynı sütun adlarına (nesil, üst) sahip iki tabloya (tablo1, tablo2) sahip olmak, istenen çıktı her iki tablonun tüm sütunlarının birleşimi olacaktır. Böylece, tablo2 satırları tablo1'e katılmalı, böylece tablo2 satırları tablo1'in üretim sütunundakilerle eşleşmelidir. Üst numara, tablo1'deki ve tablo2'deki girişler için artan olarak sıralanmalıdır. Sorgu sonuçlarının satır sayısı tablo1'in satırlarına eşit olmalıdır.

Aşağıdaki tablolar göz önüne alındığında
tablo1:

| generation | parent |
|:----------:|:------:|
| 0          | 1      |
| 0          | 2      |
| 0          | 3      |
| 1          | 3      |
| 1          | 2      |
| 1          | 1      |
| 2          | 2      |
| 2          | 1      |
| 2          | 3      |

tablo2:

| generation | parent |
|:----------:|:------:|
| 1          | 3      |
| 1          | 1      |
| 1          | 3      |
| 2          | 1      |
| 2          | 2      |
| 2          | 3      |

Yukarıda gösterildiği gibi iki örnek tablo oluşturmak ve doldurmak için aşağıdaki sorgular düşünülür:

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

hayal edilen sorgu aşağıdaki istenen sonuca yol açmalıdır:

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

Geçerli sorgu aşağıdaki gibi görünür:

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;

Bu da aşağıdaki sonuca yol açar:

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

Bu bağlantı, herhangi bir birleştirme komutunun burada gerekli olan şey olamayacağı sonucuna yol açtı ... Ancak unıon yalnızca satır ekler... bu yüzden benim için istenen sonucun nasıl elde edilebileceği kesinlikle belli değil.
Herhangi bir yardım çok takdir edilmektedir. Şimdiden teşekkürler!

join postgresql
2021-11-23 22:52:10
1

En iyi cevabı

1

Bu sorudaki ana yanlış anlama, Kartezyen ürüne dayanan ve herhangi iki kümeye uygulanabilen çok kesin matematiksel olarak tanımlanmış bir kavram olan joın'den bahsetmenizden kaynaklandı. Böylece akım çıkışı açıktır. Ancak başlıkta yazdığınız gibi, iki tabloyu yan yana koymak istiyorsunuz. Aynı sayıda satıra (üçlü) sahip olmalarından yararlanırsınız.

Bu seçim, istediğiniz çıktıyı döndürür.
Yapay birleştirme sütunları yaptım, row_number() OVER (order by generation, parent) as rnum ve ikinci tabloyu üçün eklenmesiyle taşıdı. Umarım bu size yardımcı olur:

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;

Çıktı:

tablo1_generation tablo1_parent tablo2_generation tablo2_parent
0 1 (boş) (boş)
0 2 (boş) (boş)
0 3 (boş) (boş)
1 1 1 1
1 2 1 3
1 3 1 3
2 1 2 1
2 2 2 2
2 3 2 3
2021-11-25 21:38:39

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................