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

Tiga tabel bergabung dengan gabungan selain INNER JOIN

Ya, saya menggunakan ketiga JOIN tersebut, meskipun saya cenderung menggunakan LEFT (OUTER) JOIN s alih-alih mencampurkan LEFT dan RIGHT JOIN. Saya juga menggunakan FULL OUTER JOIN s dan CROSS JOIN s.

Singkatnya, sebuah INNER JOIN membatasi resultet hanya untuk record-record yang dipenuhi oleh kondisi JOIN. Perhatikan tabel berikut

EDIT: Saya telah mengganti nama nama Tabel dan mengawalinya dengan @ sehingga Variabel Tabel dapat digunakan untuk siapa saja yang membaca jawaban ini dan ingin bereksperimen.

Jika Anda juga ingin bereksperimen dengan ini di browser, Saya telah menyiapkan semuanya di SQL Fiddle juga;

@Table1

id | name
---------
1  | One
2  | Two
3  | Three
4  | Four

@Table2

id | name
---------
1  | Partridge
2  | Turtle Doves
3  | French Hens
5  | Gold Rings

Kode SQL

DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))

INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');

DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))

INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');

Sebuah INNER JOIN Pernyataan SQL, bergabung pada id bidang

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
INNER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Hasil dalam

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens

LEFT JOIN akan mengembalikan hasil dengan semua catatan dari tabel di sisi kiri gabungan (jika Anda menulis pernyataan sebagai satu baris, tabel yang muncul lebih dulu) dan bidang dari tabel di sisi kanan gabungan yang cocok dengan ekspresi gabungan dan disertakan dalam SELECT ayat. Hilang detail akan diisi dengan NULL

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
LEFT JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Hasil dalam

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens
4  | Four | NULL

RIGHT JOIN adalah logika yang sama dengan LEFT JOIN tetapi akan mengembalikan semua catatan dari sisi kanan gabungan dan bidang dari sisi kiri yang cocok dengan ekspresi gabungan dan disertakan dalam SELECT klausa.

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
RIGHT JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Hasil dalam

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens
NULL| NULL| Gold Rings

Tentu saja, ada juga FULL OUTER JOIN , yang menyertakan catatan dari kedua tabel yang digabungkan dan mengisi yang hilang detail dengan NULL.

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
FULL OUTER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Hasil dalam

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens
4  | Four | NULL
NULL| NULL| Gold Rings

Dan CROSS JOIN (juga dikenal sebagai CARTESIAN PRODUCT ), yang hanya merupakan produk dari bidang penerapan silang di SELECT pernyataan dari satu tabel dengan bidang di SELECT pernyataan dari tabel lainnya. Perhatikan bahwa tidak ada ekspresi gabungan dalam CROSS JOIN

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
CROSS JOIN
    @Table2 t2

Hasil dalam

id | name  | name
------------------
1  | One   | Partridge
2  | Two   | Partridge
3  | Three | Partridge
4  | Four  | Partridge
1  | One   | Turtle Doves
2  | Two   | Turtle Doves
3  | Three | Turtle Doves
4  | Four  | Turtle Doves
1  | One   | French Hens
2  | Two   | French Hens
3  | Three | French Hens
4  | Four  | French Hens
1  | One   | Gold Rings
2  | Two   | Gold Rings
3  | Three | Gold Rings
4  | Four  | Gold Rings

EDIT:

Bayangkan sekarang ada Table3

@Table3

id | name
---------
2  | Prime 1
3  | Prime 2
5  | Prime 3

Kode SQL

DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))

INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');

Sekarang ketiga tabel bergabung dengan INNER JOINS

SELECT 
    t1.id,
    t1.name,
    t2.name,
    t3.name
FROM
    @Table1 t1
INNER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id
INNER JOIN
    @Table3 t3
    ON 
        t1.id = t3.id

Hasil dalam

id | name | name         | name
-------------------------------
2  | Two  | Turtle Doves | Prime 1
3  | Three| French Hens  | Prime 2

Mungkin membantu untuk memahami hasil ini dengan berpikir bahwa catatan dengan id 2 dan 3 adalah satu-satunya yang umum untuk semua 3 tabel dan juga merupakan bidang tempat kita bergabung di setiap tabel.

Sekarang ketiganya dengan LEFT JOINS

SELECT 
    t1.id,
    t1.name,
    t2.name,
    t3.name
FROM
    @Table1 t1
LEFT JOIN
    @Table2 t2
    ON 
        t1.id = t2.id
LEFT JOIN
    @Table3 t3
    ON 
        t1.id = t3.id

Hasil dalam

id | name | name         | name
-------------------------------
1  | One  | Partridge    | NULL
2  | Two  | Turtle Doves | Prime 1
3  | Three| French Hens  | Prime 2
4  | Four | NULL         | NULL

Jawaban Joel adalah penjelasan yang baik untuk menjelaskan hasil ini (Tabel1 adalah tabel dasar/asal).

Sekarang dengan INNER JOIN dan LEFT JOIN

SELECT 
    t1.id,
    t1.name,
    t2.name,
    t3.name
FROM
    @Table1 t1
INNER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id
LEFT JOIN
    @Table3 t3
    ON 
        t1.id = t3.id

Hasil dalam

id | name | name         | name
-------------------------------
1  | One  | Partridge    | NULL
2  | Two  | Turtle Doves | Prime 1
3  | Three| French Hens  | Prime 2

Meskipun kami tidak mengetahui urutan pengoptimal kueri yang akan melakukan operasi, kami akan melihat kueri ini dari atas ke bawah untuk memahami kumpulan hasil. INNER JOIN pada id antara Table1 dan Table2 akan membatasi resultet hanya untuk record yang dipenuhi oleh kondisi join yaitu tiga baris yang kita lihat pada contoh pertama. Ini sementara resultset akan menjadi LEFT JOIN ed ke Tabel3 pada id antara Tabel1 dan Tabel; Ada catatan di Tabel3 dengan id 2 dan 3, tetapi bukan id 1, jadi bidang t3.name akan memiliki detail untuk 2 dan 3 tetapi bukan 1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Fungsi FORMAT() Bekerja di SQL Server (T-SQL)

  2. Karakter Non-Angka yang Mengembalikan Positif saat menggunakan ISNUMERIC() di SQL Server

  3. 2 Cara Mendapatkan Bahasa Default Login di SQL Server (T-SQL)

  4. Tabel riwayat SQL Server - isi melalui SP atau Pemicu?

  5. Cara Mengatur Susunan Database di SQL Server (T-SQL)