union 中的查询结果如何去重?

javasister 2013-05-30 07:02:11
在以下查询结果中,由于'0' AS ccc和'1' AS ccc是数据库中不存在的字段,是我加上去的,所以这个东东变成了union在区分重复时候的依据,无法把id,name重复的数据去掉.于是下列语句的union效果就等同于union all了,但我想要的结果是:只要id和name一样就算重复,不考虑'0' AS ccc和'1' AS ccc,应该怎么办?


select id,name,'0' AS ccc from tableA
union
select id,name,'1' AS ccc from tableB
...全文
1379 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
javasister 2013-06-18
  • 打赏
  • 举报
回复
引用 12 楼 DBA_Huangzj 的回复:
你都加了个不相同的字段,那么下面一列就已经和上面一列“不重复”了,所以你的方向错了
是的,实际上我这个想法是没有出路的,我已经用别的方式取代了,不考虑用union了
發糞塗牆 2013-06-17
  • 打赏
  • 举报
回复
你都加了个不相同的字段,那么下面一列就已经和上面一列“不重复”了,所以你的方向错了
javasister 2013-06-17
  • 打赏
  • 举报
回复
引用 9 楼 zbdzjx 的回复:
试试下面这个,如果id,name相同的取1,下面的用MAX;如果id,name相同的取0,下面的用MIN。
select id,name,max(ccc) ccc from (
select id,name,'0' AS ccc from tableA
union
select id,name,'1' AS ccc from tableB
) temp1
group by id,name
这样不能实现,我这个要求应该是自相矛盾的,无法用union的方式实现
javasister 2013-06-17
  • 打赏
  • 举报
回复
引用 8 楼 u010886129 的回复:
....我算明白了... 你就这样写不好么?
select id,name,'0' AS ccc from tableA
union
select id,name,'0' AS ccc from tableB
这样既有ccc的栏位 有去掉了重复的.

select id,name,'0' AS ccc from tableA
union
select id,name,'1' AS ccc from tableB
where not exisit (select 1 AS ccc from tableA where tableA.name=tableB.name
and tableA.id=tableB.id)
这样的话你看如何
我这是'1' AS ccc from tableB和'0' AS ccc from tableA是特定的,程序中需要调用到的结果就是这样的.不能搞成相同的
zbdzjx 2013-05-31
  • 打赏
  • 举报
回复
试试下面这个,如果id,name相同的取1,下面的用MAX;如果id,name相同的取0,下面的用MIN。
select id,name,max(ccc) ccc from (
select id,name,'0' AS ccc from tableA
union
select id,name,'1' AS ccc from tableB
) temp1
group by id,name
u010886129 2013-05-30
  • 打赏
  • 举报
回复
....我算明白了... 你就这样写不好么?
select id,name,'0' AS ccc from tableA
union
select id,name,'0' AS ccc from tableB
这样既有ccc的栏位 有去掉了重复的.

select id,name,'0' AS ccc from tableA
union
select id,name,'1' AS ccc from tableB
where not exisit (select 1 AS ccc from tableA where tableA.name=tableB.name
and tableA.id=tableB.id)
这样的话你看如何
javasister 2013-05-30
  • 打赏
  • 举报
回复
引用 5 楼 u010886129 的回复:
你这个问题本身就有问题: id和name一样就算重复, 那么重复的 你后面对应的ccc 是取1呢 还是取0的 还是去掉呢? 你后面一个条件没说,就说不考虑,这个问题就没提清楚。
我只是想知道这样能不能在sql中实现,如果不能我只好在程序中另外处理,吧这个sql简化,不要后面这个0和1了
javasister 2013-05-30
  • 打赏
  • 举报
回复
引用 4 楼 sqlkxr 的回复:
咱也不明白啊,有重复的排除,你是用0还是1
我这个0和1只是程序中用到,为了方便就写在sql中了,但写在sql中就造成了麻烦,导致union的效果受到影响,不过我现在已经去掉了这个,改为在程序中另行处理
u010886129 2013-05-30
  • 打赏
  • 举报
回复
你这个问题本身就有问题: id和name一样就算重复, 那么重复的 你后面对应的ccc 是取1呢 还是取0的 还是去掉呢? 你后面一个条件没说,就说不考虑,这个问题就没提清楚。
sqlkxr 2013-05-30
  • 打赏
  • 举报
回复
咱也不明白啊,有重复的排除,你是用0还是1
javasister 2013-05-30
  • 打赏
  • 举报
回复
引用 1 楼 SmithLiu328 的回复:
你可以用分区排序然后找最小排序的数据
不明白啊
javasister 2013-05-30
  • 打赏
  • 举报
回复
换句话说,如果代码如下,那么tableB中重复的数据就不会列出来了,这个时候union就起作用了.
select id,name from tableA
union
select id,name from tableB
但如果代码如下,由于'0' AS ccc和'1' AS ccc的存在,导致union无法过滤id,name重复的数据,最终效果就是union等同于union all了
select id,name,'0' AS ccc from tableA
union
select id,name,'1' AS ccc from tableB
KevinLiu 2013-05-30
  • 打赏
  • 举报
回复
你可以用分区排序然后找最小排序的数据

22,209

社区成员

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

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