MultiPOCO查询触发错误消息

时间:2012-04-03 10:56:22

标签: tsql petapoco

我有一个查询

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子句中的“问题”和“问题”对象具有相同的公开名称。使用相关名来区分它们。

上述内容是什么?

1 个答案:

答案 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

经过一番思考后,这实际上是无效的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会产生这些表的结果,然后加入,如:

SELECT * FROM (Issue I, Condition C, Result R, Status S)
    LEFT JOIN ...

但事实并非如此。

根据您想要的结果类型(您可能最终得到一个大型结果集),您将不得不将查询重写为其他表单,并可能省略您的多表列表FROM部分。