PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Membuat kueri yang mengembalikan id jika kondisinya cocok dalam baris dari dua tabel

Telah membaca pertanyaan Anda di Meta tentang pertanyaan khusus ini, izinkan saya menjelaskan mengapa ketiga jawaban itu memang benar - seperti cara Anda menyelesaikannya.

Saya telah menyertakan contoh ketiga jawaban dan skema yang sedang mereka kerjakan:

Database changed
mysql> create table carpet(id int(3), material varchar(10), color varchar(15));
Query OK, 0 rows affected (0.02 sec)

mysql> create table curtain(id int(3), material varchar(10), color varchar(15));
Query OK, 0 rows affected (0.00 sec)

(sekelompok pernyataan sisipan)

mysql> select * from carpet;
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    2 | wool      | Beige        |
|    3 | polyester | Light Yellow |
|    4 | polyester | Light Red    |
+------+-----------+--------------+
4 rows in set (0.00 sec)

mysql> select * from curtain;
+------+----------+--------------+
| id   | material | color        |
+------+----------+--------------+
|    1 | Velvet   | Purple       |
|    2 | cotton   | White        |
|    3 | cotton   | Light Yellow |
|    4 | cotton   | Light Blue   |
+------+----------+--------------+
4 rows in set (0.00 sec)

Perpotongan menggunakan dua pernyataan pilih dan mengembalikan hasil yang cocok. Dalam hal ini, Anda mencari semua baris yang memiliki warna 'Kuning Muda' yang cocok.

Saya tidak bisa memberikan contoh di MySQL karena tidak mendukungnya (Seperti yang Anda lihat di bawah, tidak perlu memberikan hasil yang sama).

Kueri gabungan dari dua pernyataan pilih masing-masing dengan klausa where yang hanya mengizinkan warna 'Kuning Muda' akan mengembalikan data yang sama. Meskipun gabungan dapat digunakan untuk mengembalikan data yang tidak cocok, klausa where di setiap pernyataan pilih berarti bahwa memang hanya akan mengembalikan baris yang Anda inginkan.

mysql> select id, material, color from carpet
    -> union 
    -> select id, material, color from curtain;
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    2 | wool      | Beige        |
|    3 | polyester | Light Yellow |
|    4 | polyester | Light Red    |
|    1 | Velvet    | Purple       |
|    2 | cotton    | White        |
|    3 | cotton    | Light Yellow |
|    4 | cotton    | Light Blue   |
+------+-----------+--------------+
8 rows in set (0.00 sec)

Wah, parah ya? Tentu saja, kami tidak menentukan klausa where:

mysql> select id, material, color from carpet where color='Light Yellow'
    -> union
    -> select id, material, color from curtain where color='Light Yellow';
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    3 | polyester | Light Yellow |
|    3 | cotton    | Light Yellow |
+------+-----------+--------------+
3 rows in set (0.00 sec)

Gabungan antara dua tabel pada warna akan memungkinkan Anda mengembalikan baris dari kedua tabel dalam satu baris data. Anda dapat menentukan gabungan pada dua tabel untuk warna item, dan menggunakan klausa where untuk hanya mengembalikan baris yang Anda cari.

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a join carpet b on a.color=b.color;
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    1 | wool      |
|    3 | cotton   | Light Yellow |    3 | polyester |
+------+----------+--------------+------+-----------+
2 rows in set (0.00 sec)

Seperti yang Anda lihat, ini hanya mengembalikan baris dengan warna yang cocok dan memungkinkan Anda memiliki kolom dari kedua tabel dalam satu baris kumpulan hasil Anda.

Sekarang, saya jelas tidak merencanakan ini dengan baik karena saya tidak memiliki hasil yang cocok selain dari 'Kuning Muda' di kedua tabel, jadi jika saya menambahkan beberapa entri lagi, kita mendapatkan ini:

mysql> select * from curtain;
+------+----------+--------------+
| id   | material | color        |
+------+----------+--------------+
|    1 | Velvet   | Purple       |
|    2 | cotton   | White        |
|    3 | cotton   | Light Yellow |
|    4 | cotton   | Light Blue   |
|    5 | Wool     | White        |
|    6 | Fluff    | Beige        |
+------+----------+--------------+
6 rows in set (0.00 sec)

mysql> select * from carpet;
+------+-----------+--------------+
| id   | material  | color        |
+------+-----------+--------------+
|    1 | wool      | Light Yellow |
|    2 | wool      | Beige        |
|    3 | polyester | Light Yellow |
|    4 | polyester | Light Red    |
|    5 | Fluff     | Light Blue   |
+------+-----------+--------------+
5 rows in set (0.00 sec)

Sekarang kita dapat menjalankannya lagi, dan kali ini mendapatkan:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a join carpet b on a.color=b.color;
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    1 | wool      |
|    3 | cotton   | Light Yellow |    3 | polyester |
|    4 | cotton   | Light Blue   |    5 | Fluff     |
|    6 | Fluff    | Beige        |    2 | wool      |
+------+----------+--------------+------+-----------+
4 rows in set (0.00 sec)

Oh tidak!

Di sinilah kita menggunakan klausa join dan where bersama-sama:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a join carpet b on a.color=b.color 
    -> where a.color='Light Yellow';
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    1 | wool      |
|    3 | cotton   | Light Yellow |    3 | polyester |
+------+----------+--------------+------+-----------+
2 rows in set (0.00 sec)

Anda lihat, dalam SQL seringkali ada lebih banyak cara untuk mendapatkan hasil yang sama melalui cara yang berbeda daripada variasi data yang sama di tabel Anda.

Sunting:Oke, jadi jika Anda hanya ingin baris di mana semua datanya cocok, cukup sertakan dalam sintaks join:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a 
    -> join carpet b on a.color=b.color
    -> and a.id=b.id
    -> where a.color='Light Yellow';
+------+----------+--------------+------+-----------+
| id   | material | color        | id   | material  |
+------+----------+--------------+------+-----------+
|    3 | cotton   | Light Yellow |    3 | polyester |
+------+----------+--------------+------+-----------+
1 row in set (0.00 sec)

Seperti yang Anda lihat, sekarang kami memberi tahu gabungan bahwa keduanya id dan color bidang harus cocok antara dua tabel - dan hasilnya berbicara sendiri. Sekarang, dalam hal ini, saya secara teknis masih tidak cocok dengan SEMUA kolom karena bahannya berbeda. Jika Anda ingin mencocokkan lebih lanjut, kueri tidak akan mengembalikan hasil apa pun karena saya tidak memiliki catatan yang cocok dengan id, materi DAN warna yang cocok, tetapi sintaksnya adalah sebagai berikut:

mysql> select a.id, a.material, a.color, b.id, b.material 
    -> from curtain a 
    -> join carpet b on a.color=b.color
    -> and a.id=b.id
    -> and a.material=b.material
    -> where a.color='Light Yellow';
Empty set (0.00 sec)

Namun demikian, dalam banyak kasus, Anda tidak ingin semua kolom yang cocok. Sangat sering tabel memiliki ID yang hanya digunakan untuk tabel itu dan merupakan nilai yang bertambah secara otomatis. Anda ingin menggunakannya untuk mengidentifikasi baris unik di itu tabel, tetapi tidak menggunakannya untuk mencocokkan tabel yang tidak terkait. Jika ada, saya akan menyarankan agar Anda mencocokkan bahan dan warna - tetapi jangan gunakan ID-nya.



  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 cara menghitung grup partisi di tabel Postgres saya dengan fungsi jendela?

  2. Menghubungkan ke PostgreSQL di IRI Workbench

  3. pilih untuk pembaruan dengan JDBC?

  4. Postgres - Kembalikan kesalahan pada pembaruan jika catatan tidak ditemukan

  5. Apakah postgres union menjamin urutan eksekusi saat menjalankan fungsi dengan efek samping?