【问题标题】:How to comapre two columns of a table in sql?如何在sql中比较一个表的两列?
【发布时间】:2015-01-27 06:38:15
【问题描述】:

在一个表中有两列:

 -----------     
 | A  |  B |
 -----------
 | 1  |  5 |
 | 2  |  1 |
 | 3  |  2 |
 | 4  |  1 |
 -----------

想要一个如果 A=B 那么的表格

  -------------------
  |Match  | notMatch|
  -------------------
  |  1    |    5    |
  |  2    |    3    |
  | Null  |    4    |
  -------------------

我该怎么做?

我尝试了一些显示匹配部分的东西

select distinct C.A as A from Table c  inner join Table d on c.A=d.B

【问题讨论】:

  • 能否提供您的结果数据示例。
  • 问题一点都不清楚
  • 要详细说明@mmhasannn 的评论,您的结果表中没有明显的模式。 (还是桌子?真的很难说它们是不是分开的。)
  • 我认为这个想法是,如果一个数据出现在 A 列的任何位置和 B 列的任何位置,那么它应该出现在 Match 列中。否则,它应该出现在 notMatch 列中。
  • 如果 a=b 则值进入 Matched 列,其余值进入 NotMatch 列

标签: sql sql-server sql-server-2008


【解决方案1】:

试试这个:

;WITH TempTable(A, B) AS(
    SELECT 1, 5 UNION ALL
    SELECT 2, 1 UNION ALL
    SELECT 3, 2 UNION ALL
    SELECT 4, 1
)
,CTE(Val) AS(
    SELECT A FROM TempTable UNION ALL
    SELECT B FROM TempTable
)
,Match AS(
    SELECT
        Rn = ROW_NUMBER() OVER(ORDER BY Val),
        Val
    FROM CTE c
    GROUP BY Val
    HAVING COUNT(Val) > 1
)
,NotMatch AS(
    SELECT
        Rn = ROW_NUMBER() OVER(ORDER BY Val),
        Val
    FROM CTE c
    GROUP BY Val
    HAVING COUNT(Val) = 1
)
SELECT
    Match   =   m.Val, 
    NotMatch=   n.Val
FROM Match m
FULL JOIN NotMatch n
    ON n.Rn = m.Rn

【讨论】:

  • 谢谢! OP的设计很糟糕。
【解决方案2】:

尝试使用 EXCEPT、MINUS 和 INTERSECT 语句。 像这样:

SELECT A FROM TABLE1 INTERSECT SELECT B FROM TABLE1;

【讨论】:

    【解决方案3】:

    你可能想要这个:

    SELECT DISTINCT 
        C.A as A 
    FROM 
        Table c  
    LEFT OUTER JOIN 
        Table d 
        ON 
        c.A=d.B
    WHERE
        d.ID IS NULL
    

    请注意,我使用d.ID 作为示例,因为我没有看到您的架构。另一种方法是在WHERE 子句中明确声明所有d.columns IS NULL

    【讨论】:

      【解决方案4】:

      您的要求有点——我们称之为——有趣。这是一种使用枢轴解决它的方法。就我个人而言,我会选择不同的表结构和另一种选择数据的方式:

      测试数据:

      DECLARE @t table(A TINYINT, B TINYINT)
      
      INSERT @t values
      (1,5),(2,1),
      (3,2),(4,1)
      

      查询:

      ;WITH B AS
      (
        ( SELECT A FROM @t
          EXCEPT 
          SELECT B FROM @t)
         UNION ALL
        ( SELECT B FROM @t
          EXCEPT 
          SELECT A FROM @t)
      ), A AS
      (
        SELECT A val
        FROM @t
        INTERSECT
        SELECT B
        FROM @t
      ), combine as
      (
        SELECT val, 'A' col, row_number() over (order by (select 1)) rn FROM A
        UNION ALL
        SELECT A, 'B' col, row_number() over (order by (select 1)) rn
        FROM B
      )
      SELECT [A], [B]
      FROM combine
      PIVOT (MAX(val) FOR [col] IN ([A], [B])) AS pvt
      

      结果:

      A    B
      1    3
      2    4
      NULL 5
      

      【讨论】:

        猜你喜欢
        • 2015-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多