用HQL查询最大行

4

我有这张表:

+---+----+----+----+
|ID |KEY1|KEY2|COL1|
+---+----+----+----+
|001|aaa1|bbb1|ccc1|
|101|aaa1|bbb1|ddd2|
|002|aaa2|bbb2|eee3|
|102|aaa2|bbb2|fff4|
|003|aaa3|bbb3|ggg5|
|103|aaa3|bbb3|hhh6|
+---+----+----+----+

如果列key1key2相等,则结果必须包含具有最高ID的行。
+---+----+----+----+
|ID |KEY1|KEY2|COL1|
+---+----+----+----+
|101|aaa1|bbb1|ddd2|
|102|aaa2|bbb2|fff4|
|103|aaa3|bbb3|hhh6|
+---+----+----+----+

在HQL中我不能像这样使用子查询:

select * from (select....)

如何执行此查询?

**解决方案**

实际上,解决方案要复杂一些,因为KEY1KEY2位于另一个表中,该表使用两个键与第一个表连接。

+-----+-------+-------+-------+
|t1.ID|t2.KEY1|t2.KEY2|t1.COL1|
+-----+-------+-------+-------+
|  001|   aaa1|   bbb1|   ccc1|
|  101|   aaa1|   bbb1|   ddd2|
|  002|   aaa2|   bbb2|   eee3|
|  102|   aaa2|   bbb2|   fff4|
|  003|   aaa3|   bbb3|   ggg5|
|  103|   aaa3|   bbb3|   hhh6|
+-----+-------+-------+-------+

我使用了这个CORRECT查询:

SELECT t1.ID, t2.KEY1, t2.KEY2, t1.COL1
FROM yourTable1 t1, yourTable2 t2
WHERE 
t1.JoinCol1 = t2.JoinCol1 and t1.JoinCol2=t2.JoinCol2 and
t1.ID = (SELECT MAX(s1.ID) FROM yourTable1 s1, yourTable2 s2
         WHERE 
         s1.JoinCol1 = s2.JoinCol1 and s1.JoinCol2=s2.JoinCol2 and
         s2.KEY1 = t2.KEY1 AND s2.KEY2 = t2.KEY2)
1个回答

3
如果我们要在常规数据库(如MySQL或SQL Server)上直接运行此查询,可能会考虑加入子查询。然而,从我在这里读到的内容来看,HQL中的子查询只能出现在SELECTWHERE子句中。我们可以使用WHERE子句来实现您的逻辑,将您的查询表述如下。
查询语句为:
SELECT t1.ID, t1.KEY1, t1.KEY2, t1.COL1
FROM yourTable t1
WHERE t1.ID = (SELECT MAX(t2.ID) FROM yourTable t2
               WHERE t2.KEY1 = t1.KEY1 AND t2.KEY2 = t1.KEY2)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接