A consulta que estou executando é a seguinte, porém estou recebendo este erro:
# 1054 - Coluna desconhecida 'Guarante_postcode' na 'Subconsulta IN / ALL / ANY'
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'
)
)
Minha pergunta é: por que não consigo usar uma coluna falsa na cláusula where da mesma consulta ao banco de dados?
mysql
sql
mysql-error-1054
James
fonte
fonte
HAVING
executa mais lenta do queWHERE
having
funciona é porque os valores da coluna precisam ser calculados quando você chegar aohaving
. Este não é o casowhere
, como afirmado acima.Como Victor apontou, o problema está no alias. Isso pode ser evitado, colocando a expressão diretamente na cláusula WHERE x IN y:
No entanto, acho que isso é muito ineficiente, pois a subconsulta deve ser executada para todas as linhas da consulta externa.
fonte
O SQL padrão (ou MySQL) não permite o uso de aliases de coluna em uma cláusula WHERE porque
(da documentação do MySQL ). O que você pode fazer é calcular o valor da coluna na cláusula WHERE , salvar o valor em uma variável e usá-lo na lista de campos. Por exemplo, você pode fazer isso:
Isso evita repetir a expressão quando ela se torna complicada, facilitando a manutenção do código.
fonte
select @code:=sum(2), 2*@code
funcionam no MySQL 5.5, mas para mim na 5.6 a segunda coluna gera NULL na primeira chamada e retorna 2 vezes o resultado anterior quando é executada novamente. Interessante o suficiente, ambos selecionam@code:=2, 2*@code
eselect @code:=rand(), 2*@code
parecem funcionar no meu 5.6 (hoje). Mas esses estão realmente escrevendo e lendo na cláusula SELECT; no seu caso, você está definindo em WHERE.Talvez minha resposta seja tarde demais, mas isso possa ajudar outras pessoas.
Você pode anexá-lo a outra instrução select e usar a cláusula where.
calcAlias é a coluna de alias que foi calculada.
fonte
Você pode usar a cláusula HAVING para o filtro calculado nos campos e aliases SELECT
fonte
WHERE
eHAVING
, no entanto. Eles não são idênticos. stackoverflow.com/search?q=where+vs+havingEstou usando o mysql 5.5.24 e o seguinte código funciona:
fonte
O SQL padrão não permite referências a aliases de coluna em uma cláusula WHERE. Essa restrição é imposta porque, quando a cláusula WHERE é avaliada, o valor da coluna ainda pode não ter sido determinado. Por exemplo, a seguinte consulta é ilegal:
SELECT id, COUNT (*) AS cnt FROM nome_tabela ONDE cnt> 0 GROUP BY id;
fonte
Você pode usar SUBSTRING (
locations
.raw
, -6,4) para saber ondefonte