email一个字段很容易找到:
SELECT name, COUNT(email)
FROM users
GROUP BY email
HAVING COUNT(email) > 1
Run Code Online (Sandbox Code Playgroud)
所以,如果我们有一张桌子
ID NAME EMAIL
1 John asd@asd.com
2 Sam asd@asd.com
3 Tom asd@asd.com
4 Bob bob@asd.com
5 Tom asd@asd.com
Run Code Online (Sandbox Code Playgroud)
这个查询将给我们John,Sam,Tom,Tom,因为他们都有相同的email.
但是,我想要的是使用相同的name和重复name.
也就是说,我想得到"汤姆","汤姆".
我需要这个的原因:我犯了一个错误,并允许插入重复email和email值.现在我需要删除/更改重复项,所以我需要先找到它们.
惊喜 - 这是MySQL中完全有效的查询:
select X, Y from someTable group by X
Run Code Online (Sandbox Code Playgroud)
如果您在Oracle或SQL Server中尝试过此查询,则会收到自然错误消息:
Column 'Y' is invalid in the select list because it is not contained in
either an aggregate function or the GROUP BY clause.
Run Code Online (Sandbox Code Playgroud)
那么MySQL如何确定每个X显示哪个Y?它只选了一个.据我所知,它只是挑选它找到的第一个Y. 理由是,如果Y既不是聚合函数也不是group by子句,那么在查询中指定"select Y"就没有意义.因此,我作为数据库引擎将返回我想要的任何内容,你会喜欢它.
甚至还有一个MySQL配置参数来关闭这种"松散". http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
本文甚至提到MySQL在这方面如何被批评为ANSI-SQL不兼容. http://www.oreillynet.com/databases/blog/2007/05/debunking_group_by_myths.html
我的问题是: 为什么 MySQL是这样设计的?打破ANSI-SQL的理由是什么?
我的讲师说:
SELECT列表中的所有列名必须出现在GROUP BY子句中,除非name仅用于聚合函数
我只是想要对此进行一些确认,因为我无法想出为什么它应该是真实的合理解释......
根据MSDN BOL(联机丛书)对SOME的描述 任何(Transact-SQL),
有些和任何东西是等价的.
使用SOME |确实有意义 任何使查询更具可读性的方法.
但这是为什么在TSQL中有2个关键字,它们服务于完全相同的目的的唯一原因是什么?
是否有任何历史原因导致它们具有相同的功能?
我怎样才能让SQL Server返回第一个值(任何一个,我不在乎,它只需要快速)聚合时会遇到什么?
例如,假设我有:
ID Group
1 A
2 A
3 A
4 B
5 B
Run Code Online (Sandbox Code Playgroud)
我需要为每个组获取任何一个ID.我可以这样做:
Select
max(id)
,group
from Table
group by group
Run Code Online (Sandbox Code Playgroud)
返回
ID Group
3 A
5 B
Run Code Online (Sandbox Code Playgroud)
这样做,但是当我要求SQL Server计算最高ID时,我真的需要做的就是选择它遇到的第一个ID,这似乎很愚蠢.
谢谢
PS - 字段被编入索引,所以它可能没有什么区别?
sql-server random aggregation sql-server-2008 sql-execution-plan
我想创建一个算法或公式,给我以下组合.我手动打印出包含4个具有相应值的表的示例的所有组合.
这不是排列,因为我需要组合始终遵循唯一格式
表1,表2,表3,表4的值
那么如何在SQL脚本中或通过C#代码实现这一点(VB.Net代码也可以工作)
注意:该解决方案包含我的问题所需的所有可能的48种组合.
问题
表1表2表3表4
a1 b1 c1 d1
a2 b2 c2 d2
a3 c3
c4
解
a1,b1,c1,d1
a1,b1,c1,d2
a1,b1,c2,d1
a1,b1,c2,d2
a1,b1,c3,d1
a1,b1,c3,d2
a1,b1,c4,d1
a1 ,b1,c4,d2
a1,b2,c1,d1
a1,b2,c1,d2
a1,b2,c2,d1
a1,b2,c2,d2
a1,b2,c3,d1
a1,b2,c3,d2
a1, b2,c4,d1
a1,b2,c4,d2
a2,b1,c1,d1
a2,b1,c1,d2
a2,b1,c2,d1
a2,b1,c2,d2
a2,b1,c3,d1
a2,b1 ,c3,d2
a2,b1,c4,d1
a2,b1,c4,d2
a2,b2,c1,d1
a2,b2,c1,d2
a2,b2,c2,d1
a2,b2,c2,d2
a2,b2, c3,d1
a2,b2,c3,d2
a2,b2,c4,d1
a2,b2,c4,d2
a3,b1,c1,d1
a3,b1,c1,d2
a3,b1,c2,d1
a3,b1,c2 ,d2
a3,b1,c3,d1
a3,b1,c3,d2
a3,b1,c4,d1
a3,b1,c4,d2
a3,b2,c1,d1
a3,b2,c1,d2
a3,b2,c2, d1
a3,b2,c2,d2
a3,b2,c3,d1
a3,b2,c3,d2
a3,b2,c4,d1
a3,b2,c4,d2
任何人都可以解释Oracle的局限性,因为以下语句在MySQL中有效,但在Oracle中收到"不是GROUP BY表达式"?
SELECT order1.user_id,
order1.order_datetime,
SUM(order2.order_total)
FROM order_table order1
JOIN order_table order2 ON order1.user_id = order2.user_id
GROUP BY order1.user_id
Run Code Online (Sandbox Code Playgroud)
是因为Oracle不知道如何处理该order_datetime列?它不能像从GROUP BY order1.user_idMySQL中那样从行中接收到哪一行返回列结果吗?
编辑:
我知道所有列都应该在组中,但是我试图理解为什么Oracle不会像MySQL那样返回类似的结果(而MySQL不需要每个GROUP BY,而Oracle也需要).
sql ×5
mysql ×2
sql-server ×2
aggregation ×1
ansi-sql ×1
c# ×1
database ×1
duplicates ×1
oracle ×1
random ×1
t-sql ×1
vb.net ×1