首页 > 解决方案 > 比较两行并使用多个表的通用存储过程获取值不同的 cloumn 名称

问题描述

我有一些表有 10 到 30 行。现在我正在考虑表格中的两行。我需要比较这些行并显示值不同的列名列表。然后,我将在我的网站中突出显示这些列,以向我的查看者显示这些值已更改。

示例是:

ID Col1 Col2 Col3 Col4 Col5 Col6
1 5 美国广播公司 鲍勃 我们 fff
2 4 美国广播公司 鲍勃 fff

输出 :

Changed_ColumnName
Col1
Col2
Col5

现在的问题是:

  1. 这不是比较每一列和给出输出的好方法。同样,我想为我的所有表创建一个通用存储过程,我将在其中给出表名和两个列 ID,它也会这样做。如何实现?因为表列数不一样&列名不一样。我看到了其他问题,但他们建议将每个列与一个表的其他列进行比较。没有针对单个存储过程的多个表的解决方案。同样,如果数字列更多,那么比较每一列不是一个好主意。任何人都可以提出更好的方法吗?

  2. 这项工作的目的是向我网站的用户展示他以前记录和最新记录的更改,并突出显示更改的列。那么,在上面的 SQL 方法中这样做是一个好方法吗?或者将两条记录作为模型列表并在后端使用 C# 或 java 比较它们将是一个更好的解决方案?如果是,那么如何?不比较每一列。

标签: javac#sqlsql-serverlist

解决方案


一种方法是使用CASE表达式进行比较,然后取消透视(我使用VALUES表构造)以获得所需的结果:

WITH CTE AS(
    SELECT CASE R1.Col1 WHEN R2.Col1 THEN NULL ELSE 'Col1' END AS Col1,
           CASE R1.Col2 WHEN R2.Col2 THEN NULL ELSE 'Col2' END AS Col2,
           CASE R1.Col3 WHEN R2.Col3 THEN NULL ELSE 'Col3' END AS Col3,
           CASE R1.Col4 WHEN R2.Col4 THEN NULL ELSE 'Col4' END AS Col4,
           CASE R1.Col5 WHEN R2.Col5 THEN NULL ELSE 'Col5' END AS Col5,
           CASE R1.Col6 WHEN R2.Col6 THEN NULL ELSE 'Col6' END AS Col6
    FROM dbo.YourTable R1
         JOIN dbo.YourTable R2 ON R2.ID = 2
    WHERE R1.ID = 1)
SELECT V.ColumnName
FROM CTE C
     CROSS APPLY (VALUES(Col1, 'Col1'),
                        (Col2, 'Col2'),
                        (Col3, 'Col3'),
                        (Col4, 'Col4'),
                        (Col5, 'Col5'),
                        (Col6, 'Col6'))V(ColumnValue,ColumnName)
WHERE V.ColumnValue IS NOT NULL;
GO

如果您的NULL值不起作用,则需要调整CASE表达式以检查NULL值是否不同,但这应该会让您走上正确的道路。


推荐阅读