去除重复加查询问题

wh_liang 2014-09-24 10:36:23

表结构是这样的,现在有如下要求:查询所有字段,如果ename有重复,那保留ename中包含最大departid所对应的数据


这样的话,取不到ID


这样的话重复


求一个两全其美的方法
...全文
123 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hleb231 2014-09-24
  • 打赏
  • 举报
回复
引用 5 楼 wh_liang 的回复:
[quote=引用 4 楼 hleb231 的回复:]

这种写法太多了
SELECT A.* FROM #TEMP A 
                      WHERE A.DEPTID=
                            (SELECT MAX(DEPTID)
                               FROM #TEMP 
                      WHERE ENAME=A.ENAME) 
                           ORDER BY EID,ENAME

你这段没啥用,得不到我的要求[/quote]

不懂就别乱说,什么得不到你要的结果。你自己不会改下表名,和字段名。
-------------------------------------------------------------------------------------------------------

---->测试数据
IF OBJECT_ID('TEMPDB.DBO.#TEMP')IS NOT NULL 
DROP TABLE #TEMP
------------------------------------------------------------------------------------------------------------
CREATE TABLE #TEMP
(EID INT IDENTITY PRIMARY KEY,
ENAME VARCHAR(10),
DEPARTID INT
)
INSERT INTO #TEMP
SELECT 'AA',1 UNION ALL
SELECT 'BB',1 UNION ALL
SELECT 'CC',1 UNION ALL
SELECT 'DD',2 UNION ALL
SELECT 'EE',3 UNION ALL
SELECT 'FF',2 UNION ALL
SELECT 'AA',3 UNION ALL
SELECT 'AA',2 
GO

SELECT A.* FROM #TEMP A 
                      WHERE A.DEPARTID=
                            (SELECT MAX(DEPARTID)
                               FROM #TEMP 
                      WHERE ENAME=A.ENAME) 
                           ORDER BY ENAME

结果
EID         ENAME      DEPARTID
----------- ---------- -----------
7           AA         3
2           BB         1
3           CC         1
4           DD         2
5           EE         3
6           FF         2

(6 行受影响)

wh_liang 2014-09-24
  • 打赏
  • 举报
回复
引用 4 楼 hleb231 的回复:

这种写法太多了
SELECT A.* FROM #TEMP A 
                      WHERE A.DEPTID=
                            (SELECT MAX(DEPTID)
                               FROM #TEMP 
                      WHERE ENAME=A.ENAME) 
                           ORDER BY EID,ENAME

你这段没啥用,得不到我的要求
hleb231 2014-09-24
  • 打赏
  • 举报
回复

这种写法太多了
SELECT A.* FROM #TEMP A 
                      WHERE A.DEPTID=
                            (SELECT MAX(DEPTID)
                               FROM #TEMP 
                      WHERE ENAME=A.ENAME) 
                           ORDER BY EID,ENAME

wh_liang 2014-09-24
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
SELECT eid,ename,departid
  FROM (SELECT *,
               ROW_NUMBER() OVER (PARTITION BY ename 
                                  ORDER BY departid DESC
                                 ) n
          FROM employee
        ) e
 WHERE n = 1
大神真快
reenjie 2014-09-24
  • 打赏
  • 举报
回复

select eid,ename,departid from (
select *,row_number() over(partition by ename order by departid desc ) as rId from employee 
) as a where rId=1
Tiger_Zhao 2014-09-24
  • 打赏
  • 举报
回复
SELECT eid,ename,departid
FROM (SELECT *,
ROW_NUMBER() OVER (PARTITION BY ename
ORDER BY departid DESC
) n
FROM employee
) e
WHERE n = 1
wh_liang 2014-09-24
  • 打赏
  • 举报
回复
引用 8 楼 Tiger_Zhao 的回复:
4楼查询的前提必须 (ename,departid) 唯一。 假如有多条 (AA,3) 就有问题了。
是的,我这sql得好好补补,partation我都没接触过惭愧
hleb231 2014-09-24
  • 打赏
  • 举报
回复

我只是提供方法.
Tiger_Zhao 2014-09-24
  • 打赏
  • 举报
回复
4楼查询的前提必须 (ename,departid) 唯一。
假如有多条 (AA,3) 就有问题了。
wh_liang 2014-09-24
  • 打赏
  • 举报
回复
引用 6 楼 hleb231 的回复:
[quote=引用 5 楼 wh_liang 的回复:] [quote=引用 4 楼 hleb231 的回复:]

这种写法太多了
SELECT A.* FROM #TEMP A 
                      WHERE A.DEPTID=
                            (SELECT MAX(DEPTID)
                               FROM #TEMP 
                      WHERE ENAME=A.ENAME) 
                           ORDER BY EID,ENAME

你这段没啥用,得不到我的要求[/quote]

不懂就别乱说,什么得不到你要的结果。你自己不会改下表名,和字段名。
-------------------------------------------------------------------------------------------------------

---->测试数据
IF OBJECT_ID('TEMPDB.DBO.#TEMP')IS NOT NULL 
DROP TABLE #TEMP
------------------------------------------------------------------------------------------------------------
CREATE TABLE #TEMP
(EID INT IDENTITY PRIMARY KEY,
ENAME VARCHAR(10),
DEPARTID INT
)
INSERT INTO #TEMP
SELECT 'AA',1 UNION ALL
SELECT 'BB',1 UNION ALL
SELECT 'CC',1 UNION ALL
SELECT 'DD',2 UNION ALL
SELECT 'EE',3 UNION ALL
SELECT 'FF',2 UNION ALL
SELECT 'AA',3 UNION ALL
SELECT 'AA',2 
GO

SELECT A.* FROM #TEMP A 
                      WHERE A.DEPARTID=
                            (SELECT MAX(DEPARTID)
                               FROM #TEMP 
                      WHERE ENAME=A.ENAME) 
                           ORDER BY ENAME

结果
EID         ENAME      DEPARTID
----------- ---------- -----------
7           AA         3
2           BB         1
3           CC         1
4           DD         2
5           EE         3
6           FF         2

(6 行受影响)

[/quote] 不好意思我之前没仔细看你的语句,谢谢你的方法,但是我想指出的是,你两个sql语句最后的orderby不一样了啊亲,怪不得之前执行结果不对(我也是改过表名的),不过还是要感谢,你这个好理解多了

22,199

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧