您多次加入问题表,但从不使用别名。这尤其是一个问题,因为您已将同一个表添加到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 查询
您遇到的问题根本与 PetaPoco 无关。您实际上编写了一个无效的 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;
这就是前两个连接失败的主要原因。最后一个是唯一有效的,因为它可以看到两个表。您可能认为您的选择是这些表的结果,然后加入如下:
SELECT * FROM (Issue I, Condition C, Result R, Status S)
LEFT JOIN ...
但事实并非如此。
根据您想要的结果类型(您最终可能会以您正在执行的方式得到一个大型结果集),您将不得不将您的查询重写为不同的形式,并可能在您的FROM
部分中省略多表列表。