一个SQL查询不会写

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个SQL查询不会写相关的知识,希望对你有一定的参考价值。

我用的是SQL SERVER 2008。假设有N个属性。我要用到其中四个,包括PK和其他A、B、C四个属性。我要把所有的元组按照A、B、C分组,三个属性都相同的就归为一组。然后我计算一个组内元组数目,如果这个数字大于C,就把这个组内的所有数据显示出来。我写的查询语句是
select COUNT(PK)as NUM,A,B,C
from db.dbo.ab
group by A,B,C
having NUM>C
我按照这个语句查询完毕之后得到的元组数目和我按照下面的语句得到的元组数目不一致,前者大概有15000行,下面的有24000行
select *
from db.dbo.ab
where
A in(select A
from db.dbo.ab
group by A,B,C
having count(PK)>C)
and
B in(select B
from db.dbo.ab
group by A,B,C
having count(PK)>C)
and
C in(select C
from db.dbo.ab
group by A,B,C
having count(PK)>C
)
第一个得到的COUNT(PK)我计算后只有15000多,第二个得到的是所有的元组,一共是24000多,我觉的这两个应该是不会有差别的,请教一下怎么回事。

额,想明白了。第一个如果有两个分组是A1,B1,C1;A2,B2,C2,那第二句中会有A1/A2,B1/B2,C1/C2这8个分组。貌似我要查询符合要求的所有元组,麻烦会的把解决方法写出来,最好有代码

参考技术A 这个一看就有区别噻,GROUP By有两个作用,一是分组,二是合并,用了聚合函数要导致结果根据GROUP BY的的顺序进行合并结果(结果根据GROUP BY的字段不出现重复),如果不使用就只是在逻辑上分组了。

第一个你都用了聚合函数了,结果就是合并了一些按A、B、C分组后的数据

第二个完全没有合并结果。

二者都通过HAVING过滤了数据,这个无区别。
参考技术B 是inner join 。。。
select a.*
from db.dbo.ab a
inner join
(select COUNT(PK)as NUM,A,B,C
from db.dbo.ab
group by A,B,C
having NUM>C)b
on a.A=b.A and a.B=b.B and a.C=b.C本回答被提问者采纳
参考技术C 3L的不行啊,我用你的试过了,查出来了二十多万行。这个左连接是有问题的。找到的记录有22万行,实际符合要求的只有2万多行。 参考技术D 我也不懂。。。 太复杂 第5个回答  2010-11-16 什么样的?

navicat查询sql不提示

用navicat写查询sql语句时,同一个界面写完一个完整sql后要加上分号(;) 

否则后面的sql不会提示,这点与plsql还是有点区别的,予以记录。

以上是关于一个SQL查询不会写的主要内容,如果未能解决你的问题,请参考以下文章

navicat查询sql不提示

PHP/SQL - PHP 不会输出 sql 查询

写sql时,使用where 1=1进行条件拼接时 如果第一个条件不成立时,后面的条件会继续执行吗

SQL分页查询总记录数和查询信息临时表

sql 查询中 有12个月表 写一个查询从中提取所有日期

查询SQL,写一个查询SQL用来过滤表中数据,类似select ... from?