所以,这是一个非常简单的查询,但是我不确定我是否正确,因为我在纸上制作它并且没有DBMS我可以尝试它。 这是大学考试的练习。 我有这张桌子:
Serv_req
=============
PK Svr_ID
State
Req_Date
Description
他们只是要我展示最早的“开放”状态的Serv_Req的数据。
到目前为止我写的是:
SELECT Svr_ID, State, Description, MIN(Req_Date)
FROM Serv_req
WHERE State LIKE 'Open'
GROUP BY Svr_ID, State, Description
现在,这只会返回带有最旧Svr_req信息的记录吗?或者它会返回所有“开放”要求的列表,只包含最后一个的日期?
更新
我忘了提。不幸的是,课程规则不允许我们使用SELECT TOP
,LIMIT 1
甚至子查询在FROM
语句中创建辅助表。
提前感谢您的帮助!
更新2 好吧,所以,在看到我写的第一个查询完全错误之后,我再试一次。 如果您认为这是对的,请告诉我:
SELECT Svr_id, State, Description
FROM Serv_req
WHERE State LIKE 'Open'
AND Req_Date = (SELECT MIN(S1.Req_date)
FROM Serv_req S1
WHERE S1.State LIKE 'Open'
)
我知道这不是执行此查询的最清晰/最佳表现方式,但由于我的课程所施加的限制,这是我能想到的最好的方法。你们有什么感想?看起来是对的吗?
答案 0 :(得分:4)
很高兴看到ARG的其他人:)
好吧,基本上你的查询不起作用。您需要删除第二个SELECT
,但只删除关键字,而不是字段。至于问题,你问我认为你没有得到GROUP BY
。
在这种情况下,GROUP BY
将采用不同的Svr_ID, State, Description
(即创建一个唯一元组),MIN(Req_Date)
将从分组的元素中取最小值每个不同的操作。
现在,如果Svr_ID是PK,则GROUP BY
实际上不会对任何内容进行分组,因为Svr_ID本身是“不同的”,无论状态和描述字段如何。这意味着查询与此查询相同:
SELECT Svr_ID, State, Description, Req_Date
FROM Serv_req
WHERE State LIKE 'Open'
有点清楚吗?
修改强>
现在,您说您没有可以尝试这些查询的DBMS,所以让我向您介绍SQLFiddle。我建议您使用DBMS而不是Oracle,因为创建新表和插入记录的语法可能有点不友好。
现在我也在为你的问题here添加一个答案。我没有粘贴答案,所以你花时间玩它。准备好让你玩的桌子是here,所以这应该是你测试你的查询的起点......但是请记住,总是先尝试在纸上解决它们......你将无法在考试中测试它们:)
答案 1 :(得分:1)
编辑由于您无法使用TOP 1
技巧或子查询,因此您需要提出一个条件,使用基本“{less}”来阐明MIN
的定义“关系。
在将每个记录与同一个表中的所有记录进行比较时考虑问题。您可以通过构建自联接来执行此操作,以便从您加入的表中选择的所有记录都具有早期日期。会有一些记录无法找到具有严格较早日期的货币对;这是你想要的记录。显然,您需要外部连接才能将基本记录带入结果中,因为匹配不存在。您正在寻找的记录将具有独特的结构,使您可以在不希望看到的记录中识别它。
答案 2 :(得分:0)
从另一个角度来看,问题是要求最早的Serv_Req。从字面上看,结果是单个记录,即最老的记录。既然如此,没有Group By子句的第一次尝试(“我到目前为止写的是:”)将给出答案。 亲吻 - 保持简单明了