2016-09-06 4 views
0

私はPostgres 9.5.3のクエリで作業するために横を取得しようとしています。横方向のクエリの構文

select b_ci."IdOwner", 
ci."MinimumPlaces", 
ci."MaximumPlaces", 
(select count(*) from "LNK_Stu_CI" lnk 
where lnk."FK_CourseInstanceId" = b_ci."Id") as "EnrolledStudents", 

from "Course" c 
join "DBObjectBases" b_c on c."Id" = b_c."Id" 

join "DBObjectBases" b_ci on b_ci."IdOwner" = b_c."Id" 
join "CourseInstance" ci on ci."Id" = b_ci."Id", 

lateral (select ci."MaximumPlaces" - "EnrolledStudents") x 

私が一番右の欄には「MaximumPlaces」の結果になりたい - その行の「EnrolledStudents」が、それは仕事を得るのに苦労しています。現時点でPGは「登録学生」が存在しないと不満を抱いています - それはちょうど「側方」のポイントですね。私が選択して(上に示す)横句をインライン化しようとした場合

select b_ci."IdOwner", 
ci."MinimumPlaces", 
ci."MaximumPlaces", 
(select count(*) from "LNK_Stu_CI" lnk 
where lnk."FK_CourseInstanceId" = b_ci."Id") as "EnrolledStudents", 
lateral (select "MaximumPlaces" - "EnrolledStudents") as "x" 

from "Course" c 
join "DBObjectBases" b_c on c."Id" = b_c."Id" 

join "DBObjectBases" b_ci on b_ci."IdOwner" = b_c."Id" 
join "CourseInstance" ci on ci."Id" = b_ci."Id" 

それはあまりにも動揺し、私の構文エラーを与えます - ので、どこに行くのですか?

ありがとう、

アダム。

+0

わかりません。私が「側方」の行をコメントアウトすると、それは機能します。 –

+0

ここでは「外側」も必要ですか? '' SomeLabel ''のように'(ci。" MaximumPlaces " - " EnrolledStudents ")は動作しませんか? – Sevanteri

+0

エラー: "EnrolledStudents"列が存在しません - 生成列を参照できません。私が言ったように、私はそれがSQL Serverのクロス・アプリケーションに相当するものだと思っていました。 –

答えて

0

LATERALのポイントがありません。 FROM句の表の列にはアクセスできますが、SELECT句に定義されている別名はアクセスできません。

SELECT句で定義されたエイリアスにアクセスする場合は、FROM句(AKA派生テーブル)のサブクエリを使用するか、CTE (Common Table Expression)を使用して別のクエリレベルを追加する必要があります。 PostgreSQLのCTEが最適化フェンスとして機能するので、次のようにサブクエリを使用することを強くお勧めします。

select 
    -- get all columns on the inner query 
    t.*, 
    -- get your new expression based on the ones defined in the inner query 
    t."MaximumPlaces" - t."EnrolledStudents" AS new_alias 
from (
    select b_ci."IdOwner", 
    ci."MinimumPlaces", 
    ci."MaximumPlaces", 
    (select count(*) from "LNK_Stu_CI" lnk 
    where lnk."FK_CourseInstanceId" = b_ci."Id") as "EnrolledStudents", 

    from "Course" c 
    join "DBObjectBases" b_c on c."Id" = b_c."Id" 

    join "DBObjectBases" b_ci on b_ci."IdOwner" = b_c."Id" 
    join "CourseInstance" ci on ci."Id" = b_ci."Id" 
) t 
+0

Bing!そして、光が上がります!ありがとう、Matheus。 (以前のポスターに感謝しています。) –