İki tabloyu farklı sütun sayılarıyla birleştirmek


106

İki masam var (Tablo A ve Tablo B).

Bunların farklı sayıda sütunu var - Diyelim ki Tablo A'da daha fazla sütun var.

Bu iki tabloyu nasıl birleştirebilirim ve Tablo B'nin sahip olmadığı sütunlar için null alabilirim?

Yanıtlar:


215

Daha az sütuna sahip tablo için boş olarak ekstra sütunlar ekleyin.

Select Col1, Col2, Col3, Col4, Col5 from Table1
Union
Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2

6
Null sütunu için varsayılan bir değer girmenin bir yolu var mı?
Hans

3
@Hans: ColumnName olarak isnull (ColumnName, 0) veya ColumnName olarak isnull (ColumnName, '-') veya benzeri bir şey yapabilirsiniz.
Kangkan

3
Bu çözümün tüm sütunları listelemek zorunda kalmadan da çalıştığını fark ettim. Yani bunun yerine Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2, bir de yapılabilir Select *, Null as Col4, Null as Col5 from Table2.
Pratik Patel

Boş değer için, bu hack benim için çalıştı: DummyColumn olarak 'SomeString'. Temel olarak, NULL'u bir değerle değiştirirsiniz. Bu, groupby ile kullanıldığında da işe yaradı.
Saurabh Jain

8

Buraya geldim ve yukarıdaki cevabı takip ettim. Ancak veri türündeki sıradaki uyumsuzluk bir hataya neden oldu. Başka bir cevaptan alınan aşağıdaki açıklama kullanışlı olacaktır.

Yukarıdaki sonuçlar tablonuzdaki sütun dizisiyle aynı mı? çünkü oracle, sütun sıralarında katıdır. aşağıdaki örnek bir hata oluşturur:

create table test1_1790 (
col_a varchar2(30),
col_b number,
col_c date);

create table test2_1790 (
col_a varchar2(30),
col_c date,
col_b number);

select * from test1_1790
union all
select * from test2_1790;

ORA-01790: ifade, karşılık gelen ifade ile aynı veri türüne sahip olmalıdır

Gördüğünüz gibi, hatanın temel nedeni, sütun listesi belirticisi olarak * kullanımıyla ima edilen uyumsuz sütun sıralamasıdır. Bu tür hatalar, sütun listesine açıkça girilerek kolayca önlenebilir:

test1_1790 birleşiminden col_a, col_b, col_c'yi seçin hepsi test2_1790'dan col_a, col_b, col_c'yi seçin; Bu hata için daha sık karşılaşılan bir senaryo, SEÇ listesindeki iki veya daha fazla sütunu yanlışlıkla değiştirdiğiniz (veya kaydırdığınız) durumdur:

select col_a, col_b, col_c from test1_1790
union all
select col_a, col_c, col_b from test2_1790;

VEYA yukarıdakiler sorununuzu çözmezse, aşağıdaki gibi sütunlarda bir ALIAS oluşturmaya ne dersiniz : (sorgu sizinki ile aynı değildir, ancak buradaki nokta, sütuna takma adın nasıl ekleneceğidir.)

SELECT id_table_a, 
       desc_table_a, 
       table_b.id_user as iUserID, 
       table_c.field as iField
UNION
SELECT id_table_a, 
       desc_table_a, 
       table_c.id_user as iUserID, 
       table_c.field as iField

Aynı şeyi kullanmam gerekiyordu, ancak boş olmayan sütunlar için a.col_name ve b.col_name ekledim. Boş sütunlar için şunu kullanmalıydım: NULL AS col_name1, NULL AS col_name2, vb
Scott R

1
note SELECT * UNION birden çok kez zincirlenebilir; note Her SELECT cümlesinde NEREDE filtreler kullanılabilir
mirekphd

1

Normalde küme tabanlı işleçleri kullanırken aynı sayıda sütuna sahip olmanız gerekir, böylece Kangkan'ın cevabı doğrudur.

SAS SQL'in bu senaryoyu işlemek için belirli bir operatörü vardır:

SAS (R) 9.3 SQL Prosedürü Kullanıcı Kılavuzu

KARŞILIKLI (DOĞRU) Anahtar Kelime

CORRESPONDING anahtar sözcüğü yalnızca bir set operatörü belirtildiğinde kullanılır. CORR, PROC SQL'in tablo ifadelerindeki sütunları sıralı konuma göre değil ada göre eşleştirmesine neden olur. OUTER UNION operatörü haricinde, ada göre eşleşmeyen sütunlar sonuç tablosundan çıkarılır.

SELECT * FROM tabA
OUTER UNION CORR
SELECT * FROM tabB;

İçin:

+---+---+
| a | b |
+---+---+
| 1 | X |
| 2 | Y |
+---+---+

OUTER UNION CORR

+---+---+
| b | d |
+---+---+
| U | 1 |
+---+---+

<=>

+----+----+---+
| a  | b  | d |
+----+----+---+
|  1 | X  |   |
|  2 | Y  |   |
|    | U  | 1 |
+----+----+---+

U-SQL, benzer konsepti destekler:

ADINA GÖRE DIŞ BİRLİK (*)

DIŞ

BY NAME yan tümcesini ve ON listesini gerektirir. Diğer küme ifadelerinin aksine, OUTER UNION'ın çıktı şeması hem eşleşen sütunları hem de her iki taraftan eşleşmeyen sütunları içerir. Bu, bir taraftan gelen her sıranın yalnızca diğer tarafta bulunan "eksik sütunlara" sahip olduğu bir durum yaratır. Bu tür sütunlar için, "eksik hücreler" için varsayılan değerler sağlanır. Varsayılan değerler, null yapılabilir türler için null ve null yapılamayan türler için .Net varsayılan değeridir (örneğin, int için 0).

İSİMLE

OUTER ile kullanıldığında gereklidir. Madde, birleşimin değerleri konuma göre değil sütunların adına göre eşleştirdiğini belirtir. BY NAME yan tümcesi belirtilmezse, eşleştirme konumsal olarak yapılır.

ON cümlesi “*” sembolünü içeriyorsa (listenin son veya tek üyesi olarak belirtilebilir), ON cümlesindekilerin ötesinde ekstra ad eşleşmelerine izin verilir ve sonucun sütunları, içindeki tüm eşleşen sütunları içerir. sırayla sol argümanda bulunurlar.

Ve kod:

@result =    
    SELECT * FROM @left
    OUTER UNION BY NAME ON (*) 
    SELECT * FROM @right;

DÜZENLE:

Dış birleşme kavramı KQL tarafından desteklenir :

tür:

iç - Sonuç, tüm giriş tablolarında ortak olan sütunların alt kümesine sahiptir.

dış - Sonuç, girişlerin herhangi birinde yer alan tüm sütunlara sahiptir. Bir giriş satırı tarafından tanımlanmayan hücreler boş olarak ayarlanır.

Misal:

let t1 = datatable(col1:long, col2:string)  
[1, "a",  
2, "b",
3, "c"];
let t2 = datatable(col3:long)
[1,3];
t1 | union kind=outer t2;

Çıktı:

+------+------+------+
| col1 | col2 | col3 |
+------+------+------+
|    1 | a    |      |
|    2 | b    |      |
|    3 | c    |      |
|      |      |    1 |
|      |      |    3 |
+------+------+------+

demo


Bunu SQL'de nasıl başaracağınıza dair bir fikriniz var mı?
KetanVaghasiya

@KetanVaghasiya Bildiğim kadarıyla sadece SAS SQL ve U-SQL bu konsepti destekliyor.
Lukasz Szozda

-1

sadece 1 satır varsa, birleştirmeyi kullanabilirsiniz

Select t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Col5 from Table1 t1 join Table2 t2;

İki 1 satırlık tablonun birleşimi (her biri bir demet içeren iki çok kümeli ilişki), ortaya çıkan ilişkide iki satıra (tuple) sahip olur. İlişkisel cebirde (ki SQL değildir) birleşim sonucu bir satır olabilir , ancak yalnızca iki giriş ilişkisi aynı tuple içeriyorsa, örn. tek demetli bir ilişkinin öz birliği.
Robert Monfera
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.