Kueri yang saya jalankan adalah sebagai berikut, namun saya mendapatkan kesalahan ini:
# 1054 - Kolom tidak dikenal 'Guarant_postcode' di 'IN / ALL / ANY subquery'
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Pertanyaan saya adalah: mengapa saya tidak dapat menggunakan kolom palsu di klausa mana dari permintaan DB yang sama?
mysql
sql
mysql-error-1054
James
sumber
sumber
HAVING
mengeksekusi lebih lambat dariWHERE
having
adalah karena nilai kolom harus dihitung pada saat Anda mendapatkanhaving
. Ini tidak terjadi denganwhere
, sebagaimana dinyatakan di atas.Seperti yang ditunjukkan Victor, masalahnya adalah pada alias. Ini bisa dihindari, dengan meletakkan ekspresi langsung ke klausa WHERE x IN y:
Namun, saya kira ini sangat tidak efisien, karena subquery harus dieksekusi untuk setiap baris permintaan luar.
sumber
SQL standar (atau MySQL) tidak mengizinkan penggunaan alias kolom dalam klausa WHERE karena
(dari dokumentasi MySQL ). Apa yang bisa Anda lakukan adalah menghitung nilai kolom dalam klausa WHERE , menyimpan nilai dalam variabel, dan menggunakannya dalam daftar bidang. Misalnya Anda bisa melakukan ini:
Ini menghindari pengulangan ekspresi ketika bertambah rumit, membuat kode lebih mudah untuk dipelihara.
sumber
select @code:=sum(2), 2*@code
bekerja di MySQL 5.5, tetapi bagi saya di 5.6 kolom kedua menghasilkan NULL pada doa pertama, dan mengembalikan 2 kali hasil sebelumnya ketika dijalankan lagi. Cukup menarik, baik pilih@code:=2, 2*@code
danselect @code:=rand(), 2*@code
memang berfungsi di 5.6 saya (hari ini). Tapi itu memang menulis dan membaca dalam klausa SELECT; dalam kasus Anda, Anda mengaturnya di WHERE.Mungkin jawaban saya terlambat tetapi ini bisa membantu orang lain.
Anda dapat melampirkannya dengan pernyataan pilih lain dan menggunakan mana klausa untuk itu.
calcAlias adalah kolom alias yang dihitung.
sumber
Anda dapat menggunakan klausa HAVING untuk filter yang dihitung dalam bidang SELECT dan alias
sumber
WHERE
danHAVING
. Mereka tidak identik. stackoverflow.com/search?q=where+vs+havingSaya menggunakan mysql 5.5.24 dan kode berikut berfungsi:
sumber
SQL standar melarang referensi ke alias kolom dalam klausa WHERE. Pembatasan ini diberlakukan karena ketika klausa WHERE dievaluasi, nilai kolom mungkin belum ditentukan. Misalnya, kueri berikut ini ilegal:
SELECT id, COUNT (*) AS cnt FROM tbl_name WHERE cnt> 0 GROUP BY id;
sumber
Anda dapat menggunakan SUBSTRING (
locations
.raw
, -6,4) untuk kondisi manasumber