Tengo problemas para entender por qué no se puede hacer referencia a un CTE desde una cláusula WHERE . En el siguiente código, la primera consulta funciona bien, pero en la segunda consulta, simplemente reemplazando el valor en la cláusula WHERE con un CTE que calcula ese valor, produce el error "Columna desconocida 'cte' en 'cláusula where'".
# This query works SELECT * FROM stock_prices WHERE Country_Exchange_Code = 'T' AND Stock_Code IN ('1332'); # But this query produces an error WITH cte AS (SELECT '1332') SELECT * FROM stock_prices WHERE Country_Exchange_Code = 'T' AND Stock_Code IN (cte); # Here is some data to test these two queries with CREATE TABLE stock_prices (Country_Exchange_Code VARCHAR(2), Stock_Code VARCHAR(4), Date DATE, Close FLOAT); INSERT INTO stock_prices VALUES ("T", "1301", '2019-10-29', 75.2), ("T", "1301", '2019-10-30', 76.6), ("T", "1301", '2019-10-31', 77.6), ("T", "1301", '2019-11-01', 77.2), ("T", "1332", '2019-10-29', 52.5), ("T", "1332", '2019-10-30', 49.7), ("T", "1332", '2019-10-31', 50.8), ("T", "1332", '2019-11-01', 50.4), ("T", "1333", '2019-10-29', 13.9), ("T", "1333", '2019-10-30', 13.8), ("T", "1333", '2019-10-31', 14.3), ("T", "1333", '2019-11-01', 14.4);Tu puedes hacer:
WITH cte AS (SELECT '1332' as code) SELECT * FROM stock_prices WHERE Country_Exchange_Code = 'T' AND Stock_Code IN (select code from cte);Resultado:
Country_Exchange_Code Stock_Code Date Close ---------------------- ----------- ----------- ----- T 1332 2019-10-29 52.5 T 1332 2019-10-30 49.7 T 1332 2019-10-31 50.8 T 1332 2019-11-01 50.4Su consulta tenía dos problemas:
IN requiere una subconsulta formal con la forma SELECT ...as code .Ver ejemplo de ejecución en DB Fiddle .
Parece que está pensando en un cte como una especie de variable en lugar de pensar en él como una tabla virtual.
No puede hacer IN (cte) al igual que no puede hacer IN (sometablename) ; debe estar IN (select somecol from sometablename) .