Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana SQL ini bisa salah? Apa yang tidak saya lihat?

Jangan campur SQL-89 "comma-style" gabungkan sintaks dengan SQL-92 JOIN sintaksis. Ada masalah halus dengan prioritas kedua jenis operasi gabungan ini.

Dalam kasus Anda, konsekuensinya adalah mengevaluasi kondisi gabungan LEFT JOIN sebelum u alias tabel ada. Itu sebabnya tidak tahu apa u.usr_auto_key adalah.

Anda dapat memperbaiki masalah ini dengan menggunakan JOIN sintaks untuk semua gabungan:

SELECT 
  `u`.`usr_auto_key` AS `u__usr_auto_key`, 
  `s`.`set_auto_key` AS `s__set_auto_key`, 
  `u2`.`usr_auto_key` AS `u2__usr_auto_key`, 
  `u2`.`set_auto_key` AS `u2__set_auto_key`, 
  `u2`.`value` AS `u2__value` 
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key` 
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)

Saya tidak melihat kondisi gabungan antara u dan s dalam pertanyaan Anda, jadi saya berasumsi bahwa Anda menginginkan ini menjadi produk Cartesian?

Untuk detail lebih lanjut tentang interaksi antara dua bentuk sintaks untuk bergabung, lihat bagian Bergabung Memproses Perubahan di MySQL 5.0.12 pada halaman http://dev.mysql.com/doc/ refman/5.0/en/join.html

Kembali komentar Anda:Seperti yang saya katakan, itu ada hubungannya dengan prioritas operator. Jika Anda memiliki kueri SQL dengan FROM A, B JOIN C kemudian mengevaluasi B JOIN C sebelum memperhatikan A -- itu termasuk menugaskan alias tabel. Jadi jika Anda bergabung dengan kondisi B JOIN C menggunakan alias tabel untuk A Anda mendapatkan kesalahan karena alias itu belum ada.

Jika Anda membalikkannya dan menjalankan B, A JOIN C kemudian saat mengevaluasi kondisi bergabung untuk A JOIN C alias untuk A tersedia dan berfungsi (setidaknya dalam hal ini).

Tetapi ini adalah solusi yang rapuh, karena Anda mungkin juga memerlukan kueri yang tidak dapat diperbaiki hanya dengan menyusun ulang A dan B . Lebih baik berhenti menggunakan sintaks join yang sudah ketinggalan zaman dengan koma. Kemudian ekspresi gabungan apa pun memiliki akses ke semua alias tabel Anda dan Anda tidak akan pernah mengalami masalah ini dalam kueri apa pun.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql:bagaimana cara menyimpan ORDER BY setelah LEFT JOIN tanpa menyusun ulang?

  2. Ubah tabel MySQL untuk menambahkan komentar pada kolom

  3. Perbedaan antara SET autocommit=1 dan MULAI TRANSAKSI di mysql (Apakah saya melewatkan sesuatu?)

  4. cara sederhana untuk menjumlahkan hasil dari UNION di MySql

  5. MySQL One-to-Many ke format JSON