【问题标题】:SQL - Unknown column in where clauseSQL - where 子句中的未知列
【发布时间】:2012-10-19 08:29:30
【问题描述】:

我对@9​​87654322@ 很陌生,我一生都无法弄清楚为什么我不能在这里做我正在尝试的事情。我正在尝试在一次旅行中获得最少数量的免费座位,并按包裹 ID 对它们进行分组。

第一个子查询有效,但第二个是我无法弄清楚的。它说

'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;

为什么这对第一个子查询有效,而对第二个子查询无效?


更新.. 当我在 from 子句中放置“子子查询”时,似乎出现了错误。我不知道如何重写有问题的查询来解决这个问题,我真的很感激一些帮助。谢谢..

【问题讨论】:

  • 看起来很复杂,瑞典语的列名并没有真正的帮助......
  • 在实际表中是否有一个名为“SuperPaket”的列(不仅仅是作为最外层选择语句上的标签)?
  • 我建议你展示表格结构、样本数据和想要的结果。您的查询也是复杂且格式/编写错误的方式,没有表别名等等
  • 另外,您使用的是什么 RDBMS?
  • 我正在使用 MySQL,我有以下表格; pastebin.com/BkGUkrbJ 那是相关的。我没有“SuperPaket”列,这是第一个选择中 Paket.PaketID 的别名..

标签: mysql sql subquery


【解决方案1】:

我认为您不能在mysqloraclewhere 子句中使用列别名

From mysql docs

标准 SQL 不允许在 WHERE 子句中引用列别名。 施加此限制是因为当 WHERE 子句 评估,列值可能尚未确定。

您可以在 GROUP BY、ORDER BY 或 HAVING 子句中使用别名来 参考专栏:

我不知道sql server

已添加: 您的子查询可能没有得到Paket.PaketId。 尝试通过添加修改大多数外部查询的from 子句

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

如下

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;

还要从第一个 select 中删除别名,然后说 select SuperPaket

【讨论】:

  • 我会尝试使用 instad 重写它,我会报告回来。
  • @ChristopherCarlsson 由于Paket.PaketID 也不起作用,我猜它无法找到列PaketID
  • 更改为编辑中的代码,现在得到error 1248 Every derived table must have its own alias。如果我添加..."SuperPaket" from Paket) as TestTable,它仍然显示Unknown column..
  • 在这种情况下,您将不得不使用TestTable.SuperPaket。您是否也尝试过我对可能是原因的子查询级别的评论。
【解决方案2】:

您的列是 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;

【讨论】:

  • 您还有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2021-09-19
  • 2020-06-28
  • 2021-07-02
相关资源
最近更新 更多