使用 JOIN 进行 SQL Server 分页 - 列名“id”不明确

Posted

技术标签:

【中文标题】使用 JOIN 进行 SQL Server 分页 - 列名“id”不明确【英文标题】:SQL Server pagination with JOIN - Ambiguous column name 'id' 【发布时间】:2016-09-29 01:22:56 【问题描述】:

我在修复一个通常在没有 JOIN 的情况下使用的查询时遇到了麻烦,但现在我想 JOIN 几个表,我看到一个错误的列名 id 不明确。

SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]不明确的列名 'id'.1

我使用的代码:

SELECT * FROM 
            (SELECT ROW_NUMBER() OVER(ORDER BY id desc) 
            AS RowNumber,
            d.id as iddr, d.EGN, d.Names, d.NickName, d.Residence, d.PersonalMobilePhone, d.HomeAddress,d.GarantPerson, d.InsertDate, 
            t.id, t.PossitionName, 
            de.id, de.IdDriver, de.IdPAFirms,de.IdPossition 
            FROM dbo.Driver d 
            FULL JOIN dbo.DriversEmployed de ON d.id = de.IdDriver 
            FULL JOIN dbo.CompanyPossitions t ON de.IdPossition = t.id)
        AS TEST 
        WHERE RowNumber BETWEEN ? AND ? + 1

如果我只尝试加入管理 SQL 工作室,则代码 JOIN 成功。所以我想麻烦id 在这里 ORDER BY id 子句。

有没有办法在这个查询中使用 JOIN? 谢谢!

【问题讨论】:

您需要在ROW_NUMBER() OVER (ORDER BY id DESC) 中为id 加上正确的表别名。 【参考方案1】:

在您的ROW_NUMBER 函数中:

ROW_NUMBER() OVER (ORDER BY id DESC) AS RowNumber

您需要通过使用正确的表别名作为前缀来指示列id 来自哪个表,即

ROW_NUMBER() OVER (ORDER BY d.id DESC) AS RowNumber

另外,您需要为相似的列分配不同的列别名:

SELECT *
FROM (
    SELECT
        ROW_NUMBER() OVER (ORDER BY d.id DESC) AS RowNumber,
        d.id AS iddr, -- Here
        d.EGN,
        d.Names,
        d.NickName,
        d.Residence,
        d.PersonalMobilePhone,
        d.HomeAddress,
        d.GarantPerson,
        d.InsertDate,
        t.id AS CompanyPossitionsId, -- Here
        t.PossitionName,
        de.id AS DriversEmployedId, -- Here
        de.IdDriver,
        de.IdPAFirms,
        de.IdPossition
    FROM dbo.Driver d
    FULL JOIN dbo.DriversEmployed de
        ON d.id = de.IdDriver
    FULL JOIN dbo.CompanyPossitions t
        ON de.IdPossition = t.id
) AS TEST
WHERE
    RowNumber BETWEEN ? AND ? + 1

【讨论】:

谢谢,我尝试了这个但其他错误: SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]列 'id' 被多次指定为 'TEST' .1 谢谢,我明白了。【参考方案2】:

DriverCompanyPositions 表都有一个 id 列,这使得名称 id 不明确。您应该在 order by 子句中完全限定它。例如:

ORDER BY t.id

【讨论】:

谢谢,我尝试了这个但其他错误: SQLSTATE[42000]: [Microsoft][SQL Server Native Client 11.0][SQL Server]列 'id' 被多次指定为 'TEST' .1

以上是关于使用 JOIN 进行 SQL Server 分页 - 列名“id”不明确的主要内容,如果未能解决你的问题,请参考以下文章

有join的sql语句如何写分页查询?

使用 SQL Server 进行分页不会返回正确的结果

如何在 SQL Server 2008 中进行分页

我们如何使用 Flask 对 SQL Server 搜索结果进行分页

SQL Server Join

在 SQL Server 2005 中使用 ROW_NUMBER() OVER () 对不同列进行排序的分页查询