简体   繁体   English

SQL-where子句中的未知列

[英]SQL - Unknown column in where clause

I am rather new with SQL and I can't for the life of me figure out why I can't do what I'm trying here. 我对SQL相当SQL ,我终生无法弄清为什么我不能在这里尝试做些什么。 I'm trying get the least number of free seats in a package-trip, and group them by the package ID. 我正尝试在旅行中获得最少数量的免费座位,并按包裹ID进行分组。

The first of the subqueries work, but the second is the one I can't figure out. 子查询中的第一个有效,但是第二个我无法确定。 It says 它说

Unkown column SuperPaket in 'where clause' . 'where子句'中未知的列SuperPaket

select Paket.PaketID as "SuperPaket", Beskrivning, Resa.AvgångStad, Resa.AvgångTid, Resa.AvgångDatum,

    (select AnkomstTid from Resa where Resa.ResID in 
        (select ResID from PaketResa where PaketResa.PaketID = SuperPaket and Ordningsnr =
            (select max(Ordningsnr) from PaketResa where PaketResa.PaketID = SuperPaket))) "AnkomstTid",

        (select min(LedigaPlatser) from
            (select sum(AntalPlatser - Count) "LedigaPlatser", ResID from(
                select Bokning.ResID, AntalPlatser, sum(Bokning.AntalBiljetter) as Count from 
                    (Resa inner join Bokning on Resa.ResID = Bokning.ResID) where Bokning.ResID in
                        (select PaketResa.ResID from PaketResa where PaketResa.PaketID = SuperPaket)
                group by Bokning.ResID order by Count desc)
            as CountTable group by ResID) 
        as T) "LedigaPlatser"

    from ((Paket inner join PaketResa on Paket.PaketID = PaketResa.PaketID) inner join Resa on PaketResa.ResID = Resa.ResID) group by Paket.PaketID;

Why does this work for the first subquery but not the second one? 为什么这对第一个子查询有效,但对第二个子查询无效?


Update.. The error seems to appear when I put a "sub-subquery" in a from clause. 更新。当我在from子句中放入“子查询”时,似乎出现了错误。 I don't know how to rewrite the problematic query to fix this problem though, and I would really appreciate some help. 我不知道如何重写有问题的查询来解决此问题,我将非常感谢您的帮助。 Thanks.. 谢谢..

I don't think you can use column alias in a where clause in mysql and oracle 我认为您不能在mysqloraclewhere子句中使用列别名

From mysql docs 从mysql文档

Standard SQL disallows references to column aliases in a WHERE clause. 标准SQL不允许在WHERE子句中引用列别名。 This restriction is imposed because when the WHERE clause is evaluated, the column value may not yet have been determined. 之所以施加此限制,是因为在评估WHERE子句时,可能尚未确定列值。

You can use the alias in GROUP BY, ORDER BY, or HAVING clauses to refer to the column: 您可以在GROUP BY,ORDER BY或HAVING子句中使用别名来引用该列:

I have no idea about sql server 我对sql server

Added : Your subquery probably not getting Paket.PaketId . 补充:您的子查询可能没有得到Paket.PaketId Try modifying from clause of most outer query by adding 尝试通过添加来修改大多数外部查询的from子句

(select Paket.PaketID as "SuperPaket" from Paket)

as below 如下

from (
      (Paket inner join PaketResa on Paket.PaketID = PaketResa.PaketID)   
inner join Resa on PaketResa.ResID = Resa.ResID),
      (select Paket.PaketID as "SuperPaket" from Paket)
group by Paket.PaketID;

Also remove alias from first select and just say select SuperPaket 同时从第一次select删除别名,然后说select SuperPaket

your column is Paket.PaketID not "SuperPaket" so use Paket.PaketID wherever you used superpaket 您的列是Paket.PaketID而不是“ SuperPaket”,因此无论您在哪里使用superpaket,都应使用Paket.PaketID

select Paket.PaketID as "SuperPaket", Beskrivning, Resa.AvgångStad, 
        Resa.AvgångTid, Resa.AvgångDatum,

(select AnkomstTid from Resa where Resa.ResID in 
    (select ResID from PaketResa where PaketResa.PaketID = Paket.PaketID and Ordningsnr =
        (select max(Ordningsnr) from PaketResa where PaketResa.PaketID = Paket.PaketID))) "AnkomstTid",

    (select min(LedigaPlatser) from
        (select sum(AntalPlatser - Count) "LedigaPlatser", ResID from(
            select Bokning.ResID, AntalPlatser, sum(Bokning.AntalBiljetter) as Count from 
                (Resa inner join Bokning on Resa.ResID = Bokning.ResID) where Bokning.ResID in
                    (select PaketResa.ResID from PaketResa where PaketResa.PaketID = Paket.PaketID)
            group by Bokning.ResID order by Count desc)
        as CountTable group by ResID) 
    as T) "LedigaPlatser"

from ((Paket inner join PaketResa on Paket.PaketID = PaketResa.PaketID) inner join Resa on PaketResa.ResID = Resa.ResID) group by Paket.PaketID;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM