1

我有一个查询

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

上面穿的是什么?

4

1 回答 1

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 * FROM (Issue I, Condition C, Result R, Status S)
    LEFT JOIN ...

但事实并非如此。

根据您想要的结果类型(您最终可能会以您正在执行的方式得到一个大型结果集),您将不得不将您的查询重写为不同的形式,并可能在您的FROM部分中省略多表列表。

于 2012-04-03T21:22:22.103 回答