1

假设您只能使用这种语法(不能使用 MAX 或 MIN 之类的聚合函数,也不能使用 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 的项目?

我已经尝试使用 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

4

4 回答 4

1

您只想要具有绝对最新ship_date 的一件商品吗?如果是这样,那么您的查询是完全正确的:

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

唯一的问题可能是,如果 SHIP_DATE 是粗略的(如日历日期),而不是精细的(如日期时间),那么您可能会有联系。在这种情况下,您的数据库引擎只会选择其中一个,而您不会事先知道它是如何计算出来的。因此,您可能需要考虑将另一列添加到您的订单中,以使其具有确定性。

于 2009-10-21T00:39:39.550 回答
1

假设 ITEM.ship_date 不在任何其他 ITEM 记录的同一日期:

  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 记录放在结果集的顶部。

于 2009-10-21T00:40:03.920 回答
1
select distinct item_id from item 
where ship_date = 
   (select top 1 ship_date from item order by ship_date desc)
于 2009-10-21T00:49:33.233 回答
0

您的语法是否像看起来那样严格,或者可以在每列的基础上指定 distinct 与 all ?例如,你可以做这样的事情:

SELECT ship_date, DISTINCT item_id FROM tablename ORDER BY ship_date;

如果是这样,那行得通吗?

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

于 2009-10-21T00:17:35.877 回答