2009-10-21 47 views
1

假设您仅限于使用此语法(不能使用MAX或MIN等聚合函数,也不能使用GROUP BY子句;请勿“不问我为什么):运行没有GROUP BY和聚合函数的查询

{SQL query} ::= SELECT [DISTINCT | ALL] [TOP {integer}] 
       {select_list} 
       FROM {table_reference} 
       [WHERE {search_condition}] 
       [ORDER BY {orderby} { ',' {orderby} } ] 

假设我们有一个ITEM表,其中标识符被称为ITEM_ID。对于给定的ITEM_ID,您可以有多个具有相同ITEM_ID但不同SHIP_DATE的行。你如何编写一个查询,只返回具有最新SHIP_DATE的ITEMS给定的前面的语法?

我已经尝试使用TOP N(检索结果集中的第一行)与ORDER BY(从最大SHIP_DATE到最小SHIP_DATE排序)结合使用。任何想法或建议?

我想什么是这样的:

SELECT TOP N * FROM ITEM WHERE ITEM_ID='X' ORDER BY SHIP_DATE DESC 

其实前面的查询似乎是工作,但我不知道是否有更好的方式来做到这一点。

这不是功课,我需要使用支持FileNet P8的语法创建一个查询:http://publib.boulder.ibm.com/infocenter/p8docs/v4r5m1/index.jsp?topic=/com.ibm.p8.doc/developer_help/content_engine_api/guide/query_sql_syntax_ref.htm

+0

“它不起作用”不起作用。请更确切地说明你所尝试的是什么,你的期望以及你得到了什么。 – 2009-10-21 00:11:30

+0

谢谢,我再澄清一点。 – 2009-10-21 00:23:36

+0

更正,它应该是TOP N而不是TOP 1 – 2009-10-21 02:09:20

回答

1

假设ITEM.ship_date不属于同一日期的任何其他项目的记录:

SELECT TOP x 
     i.item_id, 
     i.ship_date 
    FROM ITEM i 
ORDER BY i.ship_date DESC 

...其中x是唯一/独特ITEM.item_id记录数。你怎么会没有能够使用COUNT ...

你必须使用ORDER BY i.ship_date DESC为了在结果集的顶部有最新的ship_date记录。

+0

我用这种方法结束了,谢谢! – 2009-10-28 16:32:35

0

是您的语法严格的,因为它似乎在那里,或者可以明显对比均在每列的基础上指定?举例来说,你可以做这样的事情:

SELECT ship_date, DISTINCT item_id FROM tablename ORDER BY ship_date; 

,如果是这样,那么这项工作?

如果没有,你能嵌套查询吗? (即使用子查询代替table_reference)

+0

起初看起来很有希望,但是当我尝试查询时......我发现DISTINCT不支持那种方式,它以这种方式工作(元组级别,而不是列级别): SELECT DISTINCT ship_date,item_id FROM tablename ORDER BY发货日期; 但这不是我所需要的。谢谢! – 2009-10-23 22:35:01

+0

任何想法,如果你能嵌套查询呢? – Amber 2009-10-24 00:55:09

1

你只是想要绝对最新ship_date的一个项目?如果是的话那么你的查询是完全正确的:

SELECT TOP 1 * FROM ITEM WHERE ITEM_ID='X' ORDER BY SHIP_DATE DESC 

唯一的问题可能是,如果SHIP_DATE是粗糙的东西(如日历日期),而不是罚款(如日期时间),那么你可以有关系。在这种情况下,你的数据库引擎只是选择其中一个,你不会提前知道它将如何解决这个问题。因此,您可能需要考虑在订单中添加另一列,以使其成为确定性的。

+0

对不起,我应该说TOP N – 2009-10-21 02:07:51

1
select distinct item_id from item 
where ship_date = 
    (select top 1 ship_date from item order by ship_date desc) 
+0

这只会让你得到ship_date等于最近日期的记录。 **所有**项目必须在该日期发货,同时如果在'ITEM.ship_date'上使用DateTime数据类型 – 2009-10-21 00:54:34