繁体   English   中英

用于根据以前的记录进行记录的SQL查询表(SQL Server)

[英]SQL Query Table for Changes to record based on previous record (SQL Server)

对于即将来临的问题,我深表歉意,但是我在这里可能有些烦恼……SQL不是我受过训练的东西,它是一种边学边学的方法。 我正在尝试查询SQL Server 2008中的现有单个表( 在SQL Server 2000的兼容模式下 )。

该表的结构类似于以下内容:

Table1
+----------+----------+----------+---------+---------+---------+------------+---------+
|   Date   | RecordID | Revision | AttribA | AttribB | AttribC |  AttribD   | AttribE |
+----------+----------+----------+---------+---------+---------+------------+---------+
| 1/1/2014 |        1 |        0 | mammal  | horse   | slimy   | tasty      | Grade 4 |
| 1/1/2014 |        1 |        1 | mammal  | dog     | slimy   | tasty      | Grade 3 |
| 1/1/2014 |        1 |        2 | mammal  | dog     | soft    | tasty      | Grade 2 |
| 1/1/2014 |        1 |        3 | mammal  | dog     | soft    | lick       | Grade 2 |
| 1/1/2014 |        2 |        0 | puppet  | sock    | soft    | less tasty | Grade 9 |
| 1/1/2014 |        2 |        1 | puppet  | sock    | soft    | not tasty  | Grade 9 |
+----------+----------+----------+---------+---------+---------+------------+---------+

RecordIDRevisionNumPrimary Keys 作为审核历史记录的形式, Table1 RecordID存储的单个RecordID可能有多个修订版本。

另外,假设AttributeA和AttributeB非正式地关联为Group A,AttributeC和AttributeD关联为Group B,而AttributeE单独关联为GroupC。

我的任务是编写一个给定RecordID的查询,该查询将返回以下内容:

+----------+----------+----------+---------+---------+---------+
|   Date   | RecordID | Revision | Group A | Group B | Group C |
+----------+----------+----------+---------+---------+---------+
| 1/1/2014 |        1 |        0 |         |         |         |
| 1/1/2014 |        1 |        1 |    X    |         |     X   |
| 1/1/2014 |        1 |        2 |         |    X    |     X   |
| 1/1/2014 |        1 |        3 |         |    X    |         |
+----------+----------+----------+---------+---------+---------+

如果“组”中的任何列已从先前的值更新,则查询将为带有“ X”的单个记录的每个修订返回条目。

到目前为止,我最好的尝试是:

DECLARE  @ID   INTEGER
DECLARE  @Revision  INTEGER
SET @ID = 1
SET @Revision = 3
...
  SET @GroupA = (SELECT COUNT(*) FROM
   (SELECT DISTINCT AttribA, AttribB
    FROM [dbo].[Table1]
    WHERE RecordID = @ID 
      AND RevisionID in (@Revision ,@Revision -1)) A)
... 
SELECT @ID
      ,[RevisionID]
      ,[Date]
      ,[GroupA] =
        CASE 
          WHEN @GroupA = 1 THEN ''
          ELSE 'X'
        END
...
  FROM [dbo].[Table1]
  WHERE RecordID = @ID
    AND RevisionID = @Revision

我已经剪掉了一些重复的代码来向您展示一般策略,但是老实说,我认为这是一团糟,我怀疑我能够在不将其变成噩梦的情况下进行补救。 谁能给我一个提示,告诉他们如何更好地完成SQL Server 2000兼容性中描述的任务? 感谢您的协助。

尝试下面的SQL:

UPDATED将内部联接更改为左联接。 ;)

select a.RecordId,a.Revision
    , Case When a.AttribA +' '+a.AttribB <> ab.[Group A] then 'X' else '' End as 'Group A'
    , Case When a.AttribC +' '+a.AttribD <> ab.[Group B] then 'X' else '' End as 'Group B'
    , Case When a.AttribE <> ab.[Group C] then 'X' else '' End as 'Group C'
    , a.AttribA +' '+a.AttribB as 'Group A'
    , a.AttribC+ ' ' + a.AttribD as 'Group B'
    , a.AttribE as 'Group C'
    , ab.[Group A] as 'PrevRevision A'
    , ab.[Group B] as 'PrevRevision B'
    , ab.[Group C] as 'PrevRevision C'
from @tempData a
left join
(
    select b.RecordId,b.Revision
    , b.AttribA +' '+b.AttribB as 'Group A'
    , b.AttribC+ ' ' + b.AttribD as 'Group B'
    , b.AttribE as 'Group C'
    from @tempData b

) ab on a.RecordId=ab.RecordId and a.Revision = ab.Revision + 1

order by a.RecordId, a.Revision

结果数据:

RecordId    Revision    Group A Group B Group C Group A       Group B         Group C  PrevRevision A   PrevRevision B   PrevRevision C
----------- ----------- ------- ------- ------- ------------- --------------- -------- ---------------- ---------------- --------------- 
1           0                                   mammal horse  slimy tasty     Grade 4  NULL             NULL             NULL
1           1           X               X       mammal dog    slimy tasty     Grade 3  mammal horse     slimy tasty      Grade 4
1           2                   X       X       mammal dog    soft tasty      Grade 2  mammal dog       slimy tasty      Grade 3
1           3                   X               mammal dog    soft lick       Grade 2  mammal dog       soft tasty       Grade 2
2           0                                   puppet sock   soft less tasty Grade 9  NULL             NULL             NULL
2           1                   X               puppet sock   soft not tasty  Grade 9  puppet sock      soft less tasty  Grade 9

我不知道SQL Server 2000的局限性,但是也许这种方法可行:

select 
  RecordID,
  Revision, 
  AttribA,
  AttribB,
  ( select 'X' 
    from t1 as B
    where B.RecordID = A.RecordID
    and   B.Revision = A.revision - 1
    and  (B.AttribA <> A.AttribA or B.AttribB <> A.AttribB)
  ) AS GroupA
from t1 as A
where RecordID = 1
;

这是一个显示它正在运行的小提琴: http : //sqlfiddle.com/#!3/b4626e/6

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM