0

現在、作業中の 1 回限りのレポート プロセスのために、以下のようなクエリを実行する必要があります。

ただし、テーブル内の各アイテムには複数の関連付けられた「メッセージ」があり、それらはすべて保存されます。これは、各アイテムが複数回返されることを意味します。以下の例と詳細な説明に従って、各項目を 1 回だけ表示したいと思います。

これは(少なくとも私の意見では)貧弱な構造であることは認識していますが、レポートを作成する必要があり、これがデータの保存方法です:-(

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+'%'

注: メッセージ テーブルが 2 つあるため、すべてを結合します。

メッセージの例:

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

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

インデックスを付けます

  • messages_0 / messages_1
    • (messageId、createdDate)
    • (レシーバー、messageId、createdDate、description)
  • アイテム
    • (itemId、name)
于 2012-11-27T21:44:58.510 に答える