0

我目前必须为工作中的一次性报告流程运行如下查询。

但是,对于表中的每个项目,都保存了多个关联的“消息”,这意味着每个项目都会被多次返回。根据下面的示例和进一步的解释,我只想将每个项目显示一次。

我意识到这是(至少在我看来)一个糟糕的结构,但需要完成报告,这就是数据的存储方式:-(

SQL小提琴: http ://sqlfiddle.com/#!6/76fce/8

询问:

SELECT messageId, receiver, createdDate, itemId from messages_0,items WHERE
    itemId IN (1, 2, 3)
    AND (receiver = '100' OR receiver = '200')
    AND messages_0.description LIKE '%'+items.name+'%'
union all
SELECT messageId, receiver, createdDate, itemId  from messages_1,items WHERE
    itemId IN (1, 2, 3)
    AND (receiver = '100' OR receiver = '200')
    AND messages_1.description LIKE '%'+items.name+'%'

注意:有两个消息表,因此联合所有

示例消息:

messageId | receiver | createdDate       | description
--------------
1         | 100      | 2012/11/27 12:00  | The Dog is awesome
2         | 100      | 2012/11/27 13:00  | Now the Dog is boring
4         | 200      | 2012/11/27 11:30  | I have Wood :-)

示例项目:

itemID | name 
--------------
1      | Dave
2      | Dog
3      | Wood

结果:

messageId | receiver | createdDate      | itemId 
1         | 100      | 2012/11/27 12:00 | 2
2         | 100      | 2012/11/27 13:00 | 2
4         | 200      | 2012/11/27 11:00 | 3

但是,我只需要显示每个项目一次。仅显示最旧的行(按 createdDate)。

目标结果:

messageId | receiver | createdDate      | itemId 
1         | 100      | 2012/11/27 12:00 | 2
4         | 200      | 2012/11/27 11:00 | 3

如何在 SQL (Sybase) 中执行此操作?到目前为止,我一直在查看 group by(它只会返回一个 id)和某种子查询,但一直无法让任何工作!

SQL小提琴: http ://sqlfiddle.com/#!6/76fce/8

4

1 回答 1

1

如果我理解正确的话,这样的事情可能是一个开始。

SELECT
  t, messageId, receiver, createdDate, itemId 
FROM
  (
    SELECT 
      m.messageId, m.receiver, m.createdDate, m.t,
      i.itemId 
    FROM
      items i
      INNER JOIN (
        SELECT description, messageId, receiver, createdDate, 0 t FROM messages_0 
        UNION 
        SELECT description, messageId, receiver, createdDate, 1 t FROM messages_1
      ) m ON m.description LIKE '%' + i.name + '%' 
             AND m.receiver IN ('100', '200')
    WHERE
      i.itemId IN (1, 2, 3)
  ) data
WHERE
  createdDate = (
    SELECT MIN(createdDate) FROM (
      SELECT createdDate FROM messages_0 WHERE messageId = data.messageId AND data.t = 0
      UNION
      SELECT createdDate FROM messages_1 WHERE messageId = data.messageId AND data.t = 1
    )
  )

我会把索引放在

  • 消息_0 / 消息_1
    • (messageId, createdDate)
    • (接收者、messageId、createdDate、描述)
  • 项目
    • (项目 ID,名称)
于 2012-11-27T21:44:58.510 回答