SQL:按所有列选择不同的行,但省略一列(比如ID列)

时间:2014-04-03 08:22:02

标签: c# sql sql-server entity-framework

我正在构建一个视图,通过连接几个表来通过Entity框架提取数据。由于此视图没有唯一列,因此EntityFramework无法检索正确的结果集(即第一列重复)。

为了解决这个问题,我添加了一个ID列,即ROW_NUMBER()&我的.net代码(实体)

进行了必要的更改

Refer : Entity Framework. View return duplicate records

现在真正的问题让我感到震惊,因为这个ID列也赋予了早期重复行的唯一标识:|。

我想只检索不同的行而不考虑图片中的ID /标识列。

例如:

+--------+---------+-------------+-------------+
| ID     | NUMBER  | COUNTRY     | LANG        |
+--------+---------+-------------+-------------+
| 1      | 3968    | UK          | English     |
| 2      | 3968    | UK          | English     |
| 3      | 1234    | Greece      | Greek       |
| 4      | 1234    | Italy       | Italian     |

回溯应该如下:(如果我们忽略ID列,只需要从fisrt和第二行中取出一个条目,因为它们会被重复)

+--------+---------+-------------+-------------+
| ID     | NUMBER  | COUNTRY     | LANG        |
+--------+---------+-------------+-------------+
| 1      | 3968    | UK          | English     |
| 3      | 1234    | Greece      | Greek       |
| 4      | 1234    | Italy       | Italian     |

我上面使用了一些虚拟列来轻松地说明我的问题,否则我的真实查询看起来像:

Create VIEW [dbo].[vw_PlanDetails]
AS
SELECT **DISTINCT** ROW_NUMBER() OVER (ORDER BY PLAN_CODE_LONG) ID, PM.PLAN_CODE_LONG,     SA.SERVICE_AREA_NAME, SAC.COUNTY_NAME
FROM             PLAN_MASTER AS PM INNER JOIN ...

... ...

如果需要,我可以粘贴整个查询,但这可能会使问题复杂化。 所以期待基于我的虚拟表的通用答案。

2 个答案:

答案 0 :(得分:0)

SELECT min(id) id, number, country, lang
FROM PLAN_MASTER
GROUP BY number, country, lang

答案 1 :(得分:0)

我认为你应该使用另一个函数DENSE_RANK(),然后像这样使用row_number函数:

SELECT *
FROM(
SELECT 
ROW_NUMBER() OVER (ORDER BY PLAN_CODE_LONG) ROW_NUMBER_ID
,DENSE_RANK() OVER (ORDER BY PLAN_CODE_LONG) DENSE_RANK_ID
,PM.PLAN_CODE_LONG,     SA.SERVICE_AREA_NAME, SAC.COUNTY_NAME
FROM             PLAN_MASTER AS PM INNER JOIN ...
) AS Temp
WHERE 
ROW_NUMBER_ID = DENSE_RANK_ID

我希望你会帮助你