Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Gabungkan dua tabel yang tidak memiliki bidang umum

Ada beberapa cara untuk melakukan ini, tergantung pada apa yang Anda sebenarnya ingin. Tanpa kolom umum, Anda perlu memutuskan apakah Anda ingin memperkenalkan kolom umum atau mendapatkan produk.

Katakanlah Anda memiliki dua tabel:

parts:              custs:
+----+----------+   +-----+------+
| id | desc     |   |  id | name |
+----+----------+   +-----+------+
|  1 | Sprocket |   | 100 | Bob  |
|  2 | Flange   |   | 101 | Paul |
+----+----------+   +-----+------+

Lupakan kolom yang sebenarnya karena kemungkinan besar Anda akan memiliki hubungan pelanggan/pesanan/bagian dalam hal ini; Saya baru saja menggunakan kolom tersebut untuk mengilustrasikan cara melakukannya.

Produk kartesius akan mencocokkan setiap baris di tabel pertama dengan setiap baris di tabel kedua:

> select * from parts, custs;
      id desc     id  name
      -- ----     --- ----
      1  Sprocket 101 Bob
      1  Sprocket 102 Paul
      2  Flange   101 Bob
      2  Flange   102 Paul

Itu mungkin bukan yang Anda inginkan karena 1000 bagian dan 100 pelanggan akan menghasilkan 100.000 baris dengan banyak informasi duplikat.

Atau, Anda dapat menggunakan gabungan untuk hanya menampilkan data, meskipun tidak berdampingan (Anda harus memastikan jenis kolom kompatibel antara dua pilihan, baik dengan membuat kolom tabel kompatibel atau memaksanya dalam pilihan ):

> select id as pid, desc, null as cid, null as name from parts
  union
  select null as pid, null as desc, id as cid, name from custs;
    pid desc     cid name
    --- ----     --- ----
                 101 Bob 
                 102 Paul
    1   Sprocket
    2   Flange

Di beberapa database, Anda dapat menggunakan kolom rowid/rownum atau pseudo-column untuk mencocokkan record secara berdampingan, seperti:

id desc     id  name
-- ----     --- ----
1  Sprocket 101 Bob
2  Flange   101 Bob

Kodenya akan seperti:

select a.id, a.desc, b.id, b.name
from parts a, custs b
where a.rownum = b.rownum;

Masih seperti produk kartesius tetapi where klausa membatasi bagaimana baris digabungkan untuk membentuk hasil (jadi bukan produk kartesius sama sekali).

Saya belum menguji SQL itu untuk ini karena ini adalah salah satu keterbatasan DBMS pilihan saya, dan memang demikian, saya tidak percaya itu pernah diperlukan dalam skema yang dipikirkan dengan benar. Karena SQL tidak menjamin urutan yang menghasilkan data, pencocokan dapat berubah setiap kali Anda melakukan kueri kecuali jika Anda memiliki spesifik hubungan atau order by klausa.

Saya pikir hal yang ideal untuk dilakukan adalah menambahkan kolom ke kedua tabel yang menentukan apa hubungannya. Jika tidak ada hubungan nyata, maka Anda mungkin tidak punya urusan untuk mencoba menempatkannya berdampingan dengan SQL.

Jika Anda hanya ingin mereka ditampilkan berdampingan dalam laporan atau halaman web (dua contoh), alat yang tepat untuk melakukannya adalah apa pun yang menghasilkan laporan atau halaman web Anda, ditambah dengan dua independen Kueri SQL untuk mendapatkan dua tabel yang tidak terkait. Misalnya, kisi dua kolom di BIRT (atau Crystal atau Jasper) masing-masing dengan tabel data terpisah, atau tabel dua kolom HTML (atau CSS) masing-masing dengan tabel data terpisah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Batasi Baris yang Dikembalikan dalam SQL Server Query dengan menggunakan TOP Clause

  2. Temukan karakter non-ASCII di kolom varchar menggunakan SQL Server

  3. Bagaimana Anda membuka file SDF (SQL Server Compact Edition)?

  4. T-SQL mendapatkan jumlah hari kerja antara 2 tanggal

  5. SQL Server 2016