SQL查询:根据多个表中的条件检索记录

时间:2012-04-11 14:30:32

标签: sql sql-server join

设置

我正在使用SQL Server数据库来跟踪制造环境中的各种生产情况。该数据库有两个表:

  1. 状态表:它跟踪这些情况的状态,其中一列包含表示案例状态的整数代码。代码大于0的所有情况都是“正在生产”,而代码小于或等于0的情况是“完整”或“取消”。
  2. 日志表:它会跟踪特定案例发生的更改以及这些更改何时发生。 “what”方面既可以作为字符串也可以作为代码捕获。 “when”是日期时间字段。
  3. 问题/任务/问题

    我想查询生产中的所有案例 AND 过去两天内已完成或取消 的所有案例 。在日志中,我有一个datetime列和一个特定于取消或完成案例的代码。我假设查询可能JOIN来自日志的任何具有这些代码中的任何一个并且具有在现在之前48小时内的日期时间的情况。但我不太清楚该怎么做。我的查询的第一部分(用于获取生产中的案例)如下:

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

    非常感谢任何帮助。提前谢谢!

    更新 的 澄清一下,有两件事:

    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
      )
      

1 个答案:

答案 0 :(得分: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()))