【问题标题】:Compare rows with same identifier in same table比较同一表中具有相同标识符的行
【发布时间】:2022-01-15 01:13:08
【问题描述】:

我在数据库(SQL Server)中有一个表,看起来像这样

+---------------------------------------------+
| id | p_id         | dummyColumn2 | l_id     |
+---------------------------------------------+
| 1  | 8            | someData1    | 20       |
+----+--------------+--------------+----------+
| 2  | 13           | someData2    | 20       |
+----+--------------+--------------+----------+
| 3  | 8            | someData1    | 21       |
+----+--------------+--------------+----------+
| 4  | 13           | someData2_c  | 21       |
+---------------------------------------------+

我想比较具有相同 p_id 但具有不同 l_id 的行是否相同,如果不同,则获取 p_id。 (在这种情况下,查询应该返回 13,因为它与 p_id = 13 的第二条记录不同)

一些附加信息: 想象一下 p_id 代表唯一标识符,而 l_id 代表最新插入的记录,所以我正在比较旧行 (l_id = 20) 和新行 (l_id = 21) 并获取它是否已更改。

另外请注意这个表格是简化的,所以在实际情况下它有更多的列和行

非常感谢任何帮助,并想知道是否可以使用 Joins 解决此问题。

-- 我想出了一个查询,但它似乎不起作用

//Getting latest l_id 
declare @a int 
set @a = (Select top(1) l_id from thisTable order by l_id desc) 

SELECT NEW.p_id
FROM   thisTable AS OLD
       INNER JOIN thisTable AS NEW
         ON OLD.p_id = NEW.p_id
WHERE  OLD.l_id = @a-1
       AND NEW.l_id = @a
AND OLD.dummyColumn2 <> NEW.dummyColumn2 
AND ... (same for other columns)

编辑: 想象有 1000 行,其中 200 行具有 l_id 18 ,然后另外 200 行具有 l_id 19 ,依此类推。我将具有最高 l_id 的行与之前的行进行比较(如 l_id = 21 和 l_id = 20) 较高的 l_id 意味着数据比具有较低 l_id 的数据更新

【问题讨论】:

    标签: sql sql-server join compare


    【解决方案1】:

    您可以通过exists查看:

    select *
    from t as t1
    where exists (
        select *
        from t as t2
        where t2.p_id = t1.p_id -- t2 is same group
        and   t2.l_id < t1.l_id -- t2 is an older row
        and   t2.dummyColumn2 <> t1.dummyColumn2 -- status (?) is different
    )
    

    【讨论】:

    • 谢谢,但这似乎不起作用。我已经对其进行了测试并手动将行的值更改为不同的,结果总是显示空表
    • 逻辑与你在一些附加信息中描述的一致。它确实忽略了空值。
    【解决方案2】:

    不确定我是否有问题:)

    Select * from
    thistable as A
    join thistable as B on A.P_ID=B.P_ID
    where A.l_id<>B.l_ID and A.dummycolumn2<>B.dummycolumn2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-14
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 2012-08-23
      相关资源
      最近更新 更多