我目前正在运行类似下面的查询,以便在工作中使用一次性报告流程。
但是,对于表中的每个项目,都有多个关联的“消息”全部保存,这意味着每个项目都会多次返回。根据以下示例和进一步说明,我只想展示每个项目一次。
我意识到这是(至少在我看来)一个糟糕的结构,但报告需要完成,这就是数据的存储方式: - (
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
答案 0 :(得分: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
)
)
我会把索引放在
上