0

セットアップ

SQL Server DBを使用して、製造環境での本番環境のさまざまなケースを追跡しています。データベースには2つのテーブルがあります。

  1. ステータステーブル:これは、ケースのステータスを表す整数コードを含む列の1つで、これらのケースのステータスを追跡します。コードが0より大きいケースはすべて「本番環境」であり、コードが0以下のケースは「完全」または「キャンセル」されます。
  2. ログテーブル:これは、特定のケースにどのような変更が発生したか、およびそれらの変更がいつ発生したかを追跡します。「what」の側面は、文字列とコードの両方としてキャプチャされます。「いつ」は日時フィールドです。

問題/タスク/質問

本番環境にあるすべてのケースと、過去2日以内に完了またはキャンセルされたすべてのケースを照会したいと思います。ログには、日時の列と、ケースのキャンセルまたは完了の両方に固有のコードがあります。クエリはJOIN、これらのコードのいずれかを持ち、現在から48時間以内の日時を持つログからのケースである可能性が高いと思います。しかし、私はこれをどのように行うのかよくわかりません。私のクエリの最初の部分(本番環境にあるケースを取得するため)は次のとおりです。

SELECT * FROM test.dbo.status WHERE status > 0

どんな助けでも大歓迎です。前もって感謝します!

更新 明確にするために、2つのこと:

  1. IDなどだけでなく、上記の条件に一致するレコードのステータステーブルのすべての列をクエリで返すようにします。

  2. テーブル構造:

    CREATE TABLE [dbo].[status](
        [serial] [varchar](10) NOT NULL,
        [type] [varchar](50) NULL,
        [commit_date] [date] NULL,
        [sent_to_prod] [date] NULL,
        [target] [date] NULL,
        [sent_to_mfg] [date] NULL,
        [status] [int] NULL,
        [notes] [bit] NULL,
        [hold] [bit] NULL,
        [canceled] [bit] NULL,
        [priority] [bit] NULL,
        [vendors] [varchar](150) NULL,
        [rework] [varchar](50) NULL,
        [created_on] [datetime] NULL,
        [modified_on] [datetime] NULL
    )
    
    CREATE TABLE [dbo].[log](
        [serial] [varchar](13) NOT NULL,
        [action] [varchar](200) NOT NULL,
        [who] [varchar](80) NOT NULL,
        [time] [datetime] NOT NULL,
        [code] [varchar](20) NOT NULL
    )
    
4

1 に答える 1

2

あなたが構造を提供しなかったとすると、私は次のようなものから始めます。

クエリ1:返されるレコードの数は、LogTableからの一致するレコードの数になります

SELECT StatusTable.ID, LogTable.When, etc etc etc.
FROM StatusTable INNER JOIN LogTable
  ON StatusTable.ID = LogTable.ID
WHERE StatusTable.status > 0
  OR (LogTable.WhatCode = 97   --Assumes 97 is your desired code.
  AND LogTable.When >= dateadd(hh, -48, GetDate()))

追加した

クエリ2:結合の代わりにサブクエリを使用して、LogTableから目的のIDを取得します。(のEXISTS代わりに演算子を確認することもできますIN

SELECT StatusTable.ID, StatusTable.otherField, etc etc
FROM StatusTable
WHERE StatusTable.status > 0 
  OR StatusTable.ID IN (SELECT LogTable.ID FROM LogTable WHERE LogTable.WhatCode = 97   --Assumes 97 is your desired code.
      AND LogTable.When >= dateadd(hh, -48, GetDate()))
于 2012-04-11T14:36:28.487 に答える