0

设置

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

  1. 状态表:跟踪这些案例的状态,其中一列包含表示案例状态的整数代码。所有代码大于 0 的案例都是“生产中”,而代码小于或等于 0 的案例要么是“完成”,要么是“已取消”。
  2. 日志表:跟踪特定案例发生的变化以及这些变化发生的时间。“什么”方面被捕获为字符串和代码。“何时”是一个日期时间字段。

问题/任务/问题

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

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