首页 > 解决方案 > 从查询中删除重复行和“无法绑定多部分标识符”错误

问题描述

这是我的查询,它在 Column3 中产生重复值。

Select 
D.ID,
E.Date,
D.Column3, 
E.Column4,
D.Column5,
E.Column6, 
From [TABLE_E] As E
Join [TABLE_D] as D ON E.Column3 = D.Column3 
WHERE D.Column5 IN ('Value1', 'Value2') 
Order by DATE desc

当使用一条信息更新 Table_D 时,它将在 Column3 和大多数其他列中创建具有相同值的两行。为了这个查询,我只想在 Column3 中的每个值显示一行,它来自哪一个或哪个表(D 或 E)并不重要。

我已经尝试过 DISTINCT Column3,它不起作用,但仍然带来完全相同数量的行,并且使用 GROUP BY 给我以下错误消息 'Column'D.ID' 在选择列表中无效,因为它不包含在任何一个中聚合函数或 GROUP BY 子句。

因此,在搜索了一段时间后,我发现了一个链接,建议有人在他们的查询中使用“ROW_NUMBER()、OVER、PARTITION BY 和 SEQNUM”函数(我以前从未使用过)。我试图将其改编为我的:

Select 
D.ID,
E.Date,
D.Column3, 
E.Column4,
D.Column5,
E.Column6,
FROM [TABLE_E] As E
LEFT JOIN (SELECT D.*, ROW_NUMBER() OVER (PARTITION BY E.Column3 order by E.Date DESC) as SEQNUM 
FROM [TABLE_D] as D) D ON E.Column3 = D.Column3 and 
SEQNUM = 1 
WHERE D.Column5 IN ('Value1', 'Value2') 
GROUP BY E.Column3
ORDER BY E.DATE desc

现在我收到“无法绑定多部分标识符“E.DATE”。” 作为错误消息(在与左连接的行上)。然后,我针对此错误进行了一些搜索以寻求帮助,但给出的任何答案似乎都与我的代码无关,我无法让它们工作。

如果有任何方法可以从我的第一个查询中删除重复的行,我将不胜感激。但是,如果有办法解决我在第二个查询中收到的错误,那也很好,然后我可以查看是否删除了重复项。

标签: sqlsql-server

解决方案


试试这样:

with DistinctD as (
    select max(id) as maxId, Column3 from TABLE_D 
    WHERE Column5 IN ('Value1', 'Value2')
    group by Column3
),
DistinctE as (
    select rn = ROW_NUMBER () OVER (partition by column3 order by date), *
    from TABLE_E
)
Select 
D.ID,
E.Date,
D.Column3, 
E.Column4,
D.Column5,
E.Column6
From DistinctE As E
Join TABLE_D as D ON E.Column3 = D.Column3 
where d.id in (select maxId from DistinctD)
and e.rn = 1
Order by DATE desc;

推荐阅读