2

私はかなり新しいSQLので、ここでしようとしていることができない理由を一生理解できません。パッケージ旅行で空席を最小限に抑え、パッケージ ID でグループ化しようとしています。

最初のサブクエリは機能しますが、2 番目のサブクエリはわかりません。それは言う

'where 句' の列 SuperPacket が不明です。

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;

これが最初のサブクエリでは機能するのに、2 番目のサブクエリでは機能しないのはなぜですか?


更新..「サブサブクエリ」をfrom句に入れるとエラーが表示されるようです。ただし、問題のあるクエリを書き直してこの問題を修正する方法がわかりません。助けていただければ幸いです。ありがとう..

4

2 に答える 2

2

andの句で列エイリアスを使用できないと思いますwheremysqloracle

mysql ドキュメントから

標準 SQL では、WHERE 句での列エイリアスへの参照は許可されていません。この制限が課されるのは、WHERE 句が評価されるときに、列の値がまだ決定されていない可能性があるためです。

GROUP BY、ORDER BY、または HAVING 句でエイリアスを使用して、列を参照できます。

私にはわからないsql server

追加: あなたのサブクエリはおそらく取得できませんPaket.PaketIdfrom追加して、最も外側のクエリの句を変更してみてください

(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

于 2012-10-19T11:29:46.910 に答える
-1

あなたの列は「SuperPaket」ではなくPaket.PaketIDなので、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;
于 2012-10-19T08:39:17.447 に答える