我有一个查询
return Connection.db.Fetch<Issue, Condition , Result , Status>(
"SELECT * FROM Issue I, Condition C, Result R, Status S " +
"LEFT JOIN Issue ON Condition .ID = Issue.ConditionID" +
"LEFT JOIN Issue ON Result.ID = Issue.ResultID" +
"LEFT JOIN Issue ON Status.ID = Issue.StatusID " +
"WHERE Issue.ID= "+ issueId);
给出了错误消息:
无法绑定多部分标识符“Condition.ID”。 FROM子句中的“问题”和“问题”对象具有相同的公开名称。使用相关名来区分它们。
上述内容是什么?
答案 0 :(得分:2)
您多次加入问题表,但从不使用别名。这尤其是一个问题,因为您已将同一个表添加到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
你所遇到的问题是根本不是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会产生这些表的结果,然后加入,如:
SELECT * FROM (Issue I, Condition C, Result R, Status S)
LEFT JOIN ...
但事实并非如此。
根据您想要的结果类型(您可能最终得到一个大型结果集),您将不得不将查询重写为其他表单,并可能省略您的多表列表FROM
部分。