2012-11-27 104 views
0

我目前不得不像下面那樣運行一次性工作報告過程。SQL只選擇每個ID的一次,由最早的日期時間選擇

但是,對於表中的每個項目,都有多個關聯的「消息」全部保存,這意味着每個項目會多次返回。我只想顯示每個項目一次,根據下面的示例和進一步解釋。

我意識到這是(至少在我看來)一個貧窮的結構,但需要做的報告,這是該數據是如何存儲:-(

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)? 到目前爲止,我一直在尋找兩個組(由只會返回一個id)和某種子查詢,但一直無法獲得任何工作!

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

+1

什麼是第4項? – Tomalak

+0

我的例子中的一個錯誤,閱讀3,已經更新了這個問題! –

+0

你在目標結果中顯示12:00,應該不是13:00? – Justin

回答

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 
    ) 
) 

我會把指標上

  • MESSAGES_0/MESSAGES_1
    • (MESSAGEID,createdDate)
    • (接收器,MESSAGEID,createdDate,描述)
  • 項目
    • (itemId,name)
+0

這看起來不錯,我只有一個問題,如果有兩個消息具有相同的創建日期會怎樣? –

+0

@Pez:使用相同的消息ID *和*相同的創建日期?最外面的WHERE子句中的子查詢只是返回具有匹配ID的消息。這可能是你的數據? – Tomalak

+0

不,你是對的,我是從整個DB閱讀它,而不是子集 –