我有一个包含数据的表,我正在尝试选择一些值低于最大值的值。我正在使用IBExpert,我需要在SQL中执行此操作,因为我正在使用Firebird数据库。我的表看起来像这样:
Original Stack: 1->2->3->4->5->7->NULL
Auxiliary Stack: NULL
我想要的只是选择GRUPA值低于最大值的行,这里最大值是3,但有时它可能是5,7,11或其他,所以我不能指定值。
它应该是这样的:
UID TYP ID_RODZICA ID_DZIALKI PRZED_PO GRUPA DTW OSOW DTU OSOU
17 170 K 5 765 3 551 0 1
163 759 N 5 765 53 084 0 1 29.03.2018 11:45 21
163 760 N 5 765 49 796 1 1 29.03.2018 11:45 21
163 761 N 5 765 49 426 1 1 29.03.2018 11:45 21
163 762 N 5 765 53 085 1 1 29.03.2018 11:45 21
163 763 N 5 765 53 086 1 1 29.03.2018 11:45 21
163 764 N 5 765 53 087 0 2 29.03.2018 11:45 21
163 765 N 5 765 53 088 0 2 29.03.2018 11:45 21
163 766 N 5 765 8 940 0 2 29.03.2018 11:45 21
163 767 N 5 765 41 931 0 2 29.03.2018 11:45 21
253 171 N 5 765 41 931 0 3 29.03.2018 21:14 21
253 172 N 5 765 53 088 0 3 29.03.2018 21:14 21
253 173 N 5 765 8 940 0 3 29.03.2018 21:14 21
253 174 N 5 765 49 796 0 3 29.03.2018 21:14 21
253 175 N 5 765 49 426 0 3 29.03.2018 21:14 21
253 176 N 5 765 53 085 0 3 29.03.2018 21:14 21
253 177 N 5 765 53 086 0 3 29.03.2018 21:14 21
253 178 N 5 765 67 386 0 3 29.03.2018 21:14 21
253 179 N 5 765 67 387 0 3 29.03.2018 21:14 21
253 180 N 5 765 67 388 0 3 29.03.2018 21:14 21
我试过了:
UID TYP ID_RODZICA ID_DZIALKI PRZED_PO GRUPA DTW OSOW DTU OSOU
17 170 K 5 765 3 551 0 1
163 759 N 5 765 53 084 0 1 29.03.2018 11:45 21
163 760 N 5 765 49 796 1 1 29.03.2018 11:45 21
163 761 N 5 765 49 426 1 1 29.03.2018 11:45 21
163 762 N 5 765 53 085 1 1 29.03.2018 11:45 21
163 763 N 5 765 53 086 1 1 29.03.2018 11:45 21
163 764 N 5 765 53 087 0 2 29.03.2018 11:45 21
163 765 N 5 765 53 088 0 2 29.03.2018 11:45 21
163 766 N 5 765 8 940 0 2 29.03.2018 11:45 21
163 767 N 5 765 41 931 0 2 29.03.2018 11:45 21
消除了最大值,但结果却一无所获。当我使用<而不是=在MAXVALUE(c2.GRUPA)之前我得到:
SELECT c1.*
FROM (select * FROM obdg where ID_RODZICA = '5765') c1
WHERE NOT EXISTS
(SELECT c2.*
FROM (select * from obdg WHERE ID_RODZICA = '5765') c2
WHERE c1.GRUPA = MAXVALUE(c2.GRUPA))
显然,因为我正在消除低于最大值的所有值(据我所知)。
我也尝试了一些更简单的方法:
UID TYP ID_RODZICA ID_DZIALKI PRZED_PO GRUPA DTW OSOW DTU OSOU
253 171 N 5 765 41 931 0 3 29.03.2018 21:14 21
253 172 N 5 765 53 088 0 3 29.03.2018 21:14 21
253 173 N 5 765 8 940 0 3 29.03.2018 21:14 21
253 174 N 5 765 49 796 0 3 29.03.2018 21:14 21
253 175 N 5 765 49 426 0 3 29.03.2018 21:14 21
253 176 N 5 765 53 085 0 3 29.03.2018 21:14 21
253 177 N 5 765 53 086 0 3 29.03.2018 21:14 21
253 178 N 5 765 67 386 0 3 29.03.2018 21:14 21
253 179 N 5 765 67 387 0 3 29.03.2018 21:14 21
253 180 N 5 765 67 388 0 3 29.03.2018 21:14 21
但在结果窗口中我什么都没得到。如果我将“MAXVALUE(GRUPA)”更改为“3”,我会得到预期的结果,但同样,我无法指定最大值。
我做错了什么?
答案 0 :(得分:0)
“低于”最大值意味着不存在更高的值。所以。 。 。
SELECT o.*
FROM obdg o
WHERE ID_RODZICA = 5765 AND - I'm guessing it is a number so the single quotes are not necessary
NOT EXISTS (SELECT 1
FROM obdg o2
WHERE ID_RODZICA = 5765 AND o2.GRUPA > o.GRUPA
);
肯定有其他方式来表达此查询。这似乎与你尝试的最接近。
请注意,我删除了5765
周围的单引号。 Ids通常是数字。如果你的确是一个字符串,那么使用单引号。
答案 1 :(得分:0)
据我所知,你想要:
select a.*
from OBDG a
where a.ID_RODZICA = '5765'
and a.GRUPA <> (select max(GRUPA)
from OBDG b
where b.ID_RODZICA = a.ID_RODZICA)
即:选择GRUPA
不等于GRUPA
的最大值的所有行(对于ID_RODZICA
)。
至于为什么您的查询不起作用:
在第一个查询中,NOT EXISTS
中的子查询将始终生成给定示例数据的行,而在NOT EXISTS
中,这意味着结果始终为false,因此整个查询不生成行。
您尝试的第二个查询不起作用,因为MAXVALUE
没有按照您的想法执行操作。它不是聚合函数,而是从作为参数传递的值列表中返回最高值。给定传递单个值,它将返回该值。这导致GRUPA < MAXVALUE(GRUPA)
等同于GRUPA < GRUPA
,这永远不会成立,所以它再也不会产生任何行。