問題テーブルに数回参加していますが、エイリアスは使用していません。句FROM
の一部に同じテーブルを追加したため、これは特に問題です。SELECT
結合では常にエイリアスを使用します。それが最も安全な方法です。
したがって、Issue.ID クエリ エンジンが参照しているエンジンを解決できないと言ったときはいつでも。それはFROM
部分的なものか、部分的なものかJOIN
。
このコードを試してください:
return Connection.db.Fetch<Issue, Condition , Result , Status>(
"SELECT * FROM Issue I, Condition C, Result R, Status S " +
"LEFT JOIN Issue i1 ON C.ID = i1.ConditionID" +
"LEFT JOIN Issue i2 ON R.ID = i2.ResultID" +
"LEFT JOIN Issue i3 ON S.ID = i3.StatusID " +
"WHERE I.ID = " + issueId);
それとは別に、文字列連結の代わりにパラメーターを使用することを強くお勧めします。
return Connection.db.Fetch<Issue, Condition , Result , Status>(
"SELECT * FROM Issue I, Condition C, Result R, Status S " +
"LEFT JOIN Issue i1 ON C.ID = i1.ConditionID" +
"LEFT JOIN Issue i2 ON R.ID = i2.ResultID" +
"LEFT JOIN Issue i3 ON S.ID = i3.StatusID " +
"WHERE I.ID = @0", issueId); // see the change in this line
いくつかの考えの後、これは実際には無効な SQL クエリです
あなたが抱えている問題は、ペタポコとはまったく関係ありません。実際には、無効な SQL クエリを作成しました。この同じステートメントを SSMS で実行すると、同じエラーが発生します。これは、クエリが次のように解釈されるためです。
SELECT * FROM Issue I, Condition C, Result R,
(Status S
LEFT JOIN Issue i1
ON C.ID = i1.ConditionID
LEFT JOIN Issue i2
ON R.ID = i2.ResultID
LEFT JOIN Issue i3
ON S.ID = i3.StatusID
)
WHERE I.ID = x;
これが、最初の 2 つの結合が失敗する主な理由です。両方のテーブルが表示されるため、最後の 1 つだけが機能します。あなたはおそらく、あなたの選択がそれらのテーブルの結果を作り、次に次のように結合すると思ったでしょう:
SELECT * FROM (Issue I, Condition C, Result R, Status S)
LEFT JOIN ...
しかし、そうではありません。
必要な結果の種類に応じて (結果として結果セットが大きくなる可能性があります)、クエリを別の形式に書き直して、FROM
一部の複数テーブル リストを省略する必要があります。