复杂的SQL查询

问题描述:

我想构建一个特定的SQL查询,但我不知道如何实现我想要的。
我的数据库看起来是这样的:复杂的SQL查询

Col1 Col2 
"a" 5 
"b" 7 
"a" 8 
"a" 7 
"b" 5 
"b" 7 
"c" 3 
"a" 4 
"b" 3 
"b" 4 
"c" 1 

而且我想返回像这样的查询:

"a" 8 
"a" 7 
"b" 7 
"b" 7 

在口头上:第一个x串的2个最高值。

只有在排序后才放置限制不起作用,因为顺序是指整个结果,而不仅仅指结果的一个“组”。 我希望你明白我的意思。

+0

“第X串” 命令怎么样?按最高col2? – Blorgbeard 2010-06-25 10:54:26

+0

是的,但这并不重要。 我不明白的是切割结果。 – Graslandpinguin 2010-06-25 11:06:29

select tbl.col1, tbl.col2 from tbl inner join 
(select col2 from tbl order by col2 desc Limit 2) as t1 on 
t1.col2 = tbl.col2 order by tbl.col1,tbl.col2 
+0

他是在SQLite上,那里没有'TOP' – Pentium10 2010-06-25 10:57:18

+0

Pentium10,谢谢..修改查询 – Samiksha 2010-06-25 11:04:49

+0

这不行,遗憾的是。查看@ soren的解决方案。 – 2010-06-25 12:18:55

如果可以,请使用Hibernate for Java或Spring JDBC模板等更高级别的库。其他语言还有其他可能性。除非你想要失去时间,否则不要在你的应用程序中编写SQL。

编辑1:当然,你可能别无选择。你可能会与你没有写的东西进行交互。但是,如果您要创建自己的数据库,那么当您在应用程序中集成低级的,臃肿的,不可维护的,特定于RDBMS的SQL查询时,这可能表明您正在做错某些事情。我宁愿使用Hibernate,并让应用程序运行速度慢于花费我的开发时间修复SQL代码。如果你想提供真实的,可维护的应用程序,我认为“复杂”是一般应避免的事情。

+0

我不明白为什么有人降低了这一点。它没有回答这个问题,而是指出用户有更好的方法来解决他的问题。如果我是提问者,我更喜欢这样的答案。 – 2010-06-25 12:20:26

+2

@Matteo Mosca:我很同情这是因为这是一个不特别关系的任务(发布的数据甚至没有关键字!)但是,“不要在你的应用程序中编写SQL”麻​​烦一点一般化,你不觉得吗? – onedaywhen 2010-06-25 13:08:30

+0

那么,我认为如果我可以在更高层次的抽象(比如Linq和实体框架)上工作,那么它仍然会产生下面的质量SQL,为什么我应该为编写我的应用程序编写sql而烦恼呢? 不同的故事,如果你需要为其他需求编写sql,这些视图直接存储在数据库,存储过程等,但现在为.Net应用程序,如果你可以使用Linq和和ORM,Sql真的被弃用。无论如何,这只是我的看法。 – 2010-06-25 13:59:31

这是不漂亮,但..

SELECT * FROM 
    (SELECT DISTINCT col1, 
      (SELECT col2 FROM tbl WHERE tbl.col1 = a.col1 ORDER BY col2 DESC LIMIT 1) FROM tbl a 

    UNION ALL 
    SELECT DISTINCT col1, 
      (SELECT col2 FROM tbl WHERE tbl.col1 = a.col1 ORDER BY col2 DESC LIMIT 1 offset 1) FROM tbl a) 
ORDER BY 1,2 DESC; 
+1

但我必须同意Pierre Gardin。除非你想要丢失/浪费时间,否则不要打扰写SQL(特别是这个丑陋的SQL)。不过,我不得不佩服你设法让它成为我浪费时间而不是你自己的时间。 :) – Soren 2010-06-25 11:46:43

+1

啊,是的,很好赶上了错字。显然,我还没有完全掌握剪切和粘贴的古老艺术。 :) – Soren 2010-06-25 12:47:29

+0

+1为古代艺术评论。这将是FB当天的状态,希望你不介意我的复制粘贴 – 2010-08-25 09:22:54