【问题标题】:Is there a way to compare 2 columns of table in SQL Server有没有办法比较 SQL Server 中表的 2 列
【发布时间】:2018-04-16 17:18:50
【问题描述】:

有人可以给我一个解决这个问题的想法吗?在表中查找 2 列具有相同的数据,我们不知道列是否相同。

我可以将部分数据移动到 excel 中进行检查吗?

我有大约 39 列和 2B 行

  • Col1 等于 col3
  • col2 等于 col6
  • col4 不等于 col5

输出应该只显示常见的列或一些常见的输出

空值困扰着我。

提前致谢。

【问题讨论】:

  • 你的意思是2行包含相同的数据吗?不然你不就是在说SELECT * FROM Table WHERE Column1 = Column2吗?还是您的意思是包含相同数据的整列?
  • 所有列都是同一类型吗?
  • 请显示示例数据和预期结果
  • 编辑,贴出输入输出
  • 这非常模糊。我认为您想将一行的每一列与该行中的每一列进行比较。这本身就是一项令人讨厌的工作,因为它表明背离了关系数据的基础。但更糟糕的是,您没有显示您期望的输出。那么数据类型呢?每列都是相同的数据类型吗?在获得真正的答案之前,您需要在此处提供更多详细信息。尝试从这里开始。 spaghettidba.com/2015/04/24/…

标签: sql sql-server excel


【解决方案1】:

如果您有 39 列,并且想要对每个列进行评估,那么您需要评估 741 列配对。可以以简洁的方式做到这一点但我不建议对 20 亿行这样做!

SELECT V1.name,
       V2.name
FROM   YourTable T WITH (TABLOCKX)
       CROSS APPLY (SELECT (SELECT T.*
                            FOR xml path('row'), elements, type)) CA(X)
       CROSS APPLY CA.X.nodes('/row/*') N1(n)
       CROSS APPLY CA.X.nodes('/row/*') N2(n)
       CROSS APPLY (VALUES(n1.n.value('local-name(.)', 'sysname'), n1.n.value('.', 'nvarchar(4000)') )) V1(name, val)
       CROSS APPLY (VALUES(n2.n.value('local-name(.)', 'sysname'), n2.n.value('.', 'nvarchar(4000)') )) V2(name, val)
WHERE  V2.name < V1.name
       AND V1.val = V2.val
GROUP  BY V1.name,
          V2.name
HAVING COUNT(*) = (SELECT COUNT(*)
                   FROM   YourTable) 

您应该首先分析列中的值。获取所有列的MINMAXCOUNT(也可能是数字列的其他聚合数据)。丢弃COUNT 不等于整个行数的任何列,因为这些列与您对NULLs 的期望处理不匹配,并标识具有相同MINMAX 的列集以供进一步调查。

如果您对示例数据执行此操作,您会发现唯一值得研究的对是 Col1 &lt;-&gt; col3Col2 &lt;-&gt; col6。因此,您可以进行更有针对性的查询,以确定是否确实如此。

SELECT COUNT(*), 
       SUM(CASE WHEN col1 = col3  THEN 1 ELSE 0 END) AS count_rows_same_1_3, 
       SUM(CASE WHEN col2 = col6  THEN 1 ELSE 0 END) AS count_rows_same_2_6
FROM YourTable T

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-09
    • 2014-07-28
    • 2021-09-01
    • 2021-12-06
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多