Yanıtlar:
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
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.
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
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:
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 |
+------+------+------+
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;