【问题标题】:SQL Compare rowsSQL 比较行
【发布时间】:2015-04-25 18:12:39
【问题描述】:

好的,情况如下: 我将以下数据放在一个表格中。

PAIR_NO NO          NO2

3       5678EFGH    1234ABCD
4       1111BBBB    0000AAAA
1       1234ABCD    5678EFGH
2       0000AAAA    1111BBBB

约束条件是如果 no = no2 在另一行中跳过该行。 因此,在此示例数据中,将选择的唯一行应该是第 3 和第 4 对。

我曾尝试与 self 合并和内部连接,但我只是不断地取回所有 4 行。

我试图插入一个不存在的表中,但我再次插入了 4 行。

   SELECT a.* from PAIRS a
   inner join PAIRS b on a.no=b.no2 and a.no2=b.no;

我在想也许可以从第 1 列中选择不同的数字,然后检查第 2 列中的数字,但我认为这会产生相同的四行。

我可能想多了这个问题,也许这里的一些人可以看看这个,看看解决方案隐藏在哪里。

我目前正在 MySQL 上对此进行测试,但它应该在 SQLServer 2008 上运行。我已经搜索过,但所有问题似乎都与我的数据集问题不匹配。

【问题讨论】:

  • 注意:对于您提供的所有 4 行,NONO2 之间的任何其他行都匹配。我不知道你怎么认为应该只选择第 3 对和第 4 对。
  • 如果我在 C# 中执行此操作,我将为行创建一个保存对象。
  • 如果我在 C# 中执行此操作,我将为行创建一个保存对象。然后,当我循环每一行时,测试 - 第 1 列是否与持有对象中的第 2 列匹配。如果它不存在,则添加到持有对象。但是我需要尝试在 SQL 中重新创建它,并且我试图避免使用 WHILE 循环(当我处理更多记录时太慢了)。

标签: mysql sql sql-server compare


【解决方案1】:

言出必行,意思是选择所有no 列的值未出现在同一表中no2 列中的任何位置的记录,试试这个:

SELECT A.PAIR_NO, A.NO, A.NO2
FROM PAIRS A 
LEFT JOIN PAIRS B ON(A.NO = B.NO2)
WHERE B.PAIR_NO IS NULL -- assuming this column is not nullable

另一种选择是使用NOT EXISTS

SELECT PAIR_NO, NO, NO2
FROM PAIRS A
WHERE NOT EXISTS(
    SELECT 1
    FROM PAIRS B
    WHERE B.NO2 = A.NO
)

我个人更喜欢 LEFT JOIN 选项,因为它更短且更具可读性。
这两个语句都应该适用于 MySql 和 Sql Server。

【讨论】:

    【解决方案2】:

    好的,伙计们,我想感谢大家的帮助,但我想我解决了我的问题。花了我一秒钟,但我相信这就是我所追求的(SQL Server 2008):

    if OBJECT_ID('tempdb..#pairs') is not null drop table #pairs 
    if OBJECT_ID('tempdb..#pairs_final') is not null drop table #pairs_final
    create table #pairs(pair_no int, a_no varchar(17),a_no2 varchar(17))
    create table #pairs_final(pair_no int Identity(1,1), a_no varchar(17),a_no2 varchar(17))
    
    
    insert into #PAIRS values(1,'1234ABCD','5678EFGH');
    insert into #PAIRS values(1,'1234ABCD','XXXX9999');
    insert into #PAIRS values(2,'0000AAAA','1111BBBB');
    insert into #PAIRS values(3,'5678EFGH','1234ABCD');
    insert into #PAIRS values(4,'1111BBBB','0000AAAA');
    insert into #PAIRS values(1,'XXXX9999','1234ABCD');
    
    insert into #pairs_final
    select a.a_no,a.a_no2 from #pairs a
        join (
            select distinct a_no_p from(
                select pair_no,a_no_p,
                ROW_NUMBER() over (partition by pair_no order by a_no_p) as RN
                from #pairs
                unpivot(
                     a_no_p for clms in (a_no2,a_no)
                ) as umpvt
            ) as mypairs
            where RN = 1
         ) as my_pairs on my_pairs.a_no_p=a.a_no
    
    select * from #pairs_final
    

    这会给我以下结果:

    pair_no  a_no       a_no2
    1        1234ABCD   5678EFGH
    2        1234ABCD   XXXX9999
    3        0000AAAA   1111BBBB
    

    希望这可能对其他人有所帮助。 享受吧。

    【讨论】:

      【解决方案3】:
      DECLARE @TBL AS TABLE
      (
      [NO] INT,
      [CODE] VARCHAR(50),
      [AREA] VARCHAR(50)
      )
      
      /* EXAMPLE 1 */
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (1,'001','A00')
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (2,'001','A00')
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (3,'001','B00')
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (4,'001','C00')
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (5,'001','C00')
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (6,'001','A00')
      INSERT INTO @TBL([NO],[CODE],[AREA]) VALUES (7,'001','A00')
      
      /* EXAMPLE 2 */
      /* ***** USE THIS CODE TO ENTER DATA FROM DIRECT TABLE *****
      SELECT
      ROW_NUMBER() OVER(ORDER BY [FIELD_DATE]) AS [NO]
      ,[FIELD_CODE] AS [CODE]
      ,[FIELD_AREA] AS [AREA]
      FROM TABLE_A
      WHERE CAST([FIELD_DATE] AS DATE) >= CAST('20200307' AS DATE)
      ORDER BY [FIELD_DATE],[FIELD_CODE]
      */
      
      SELECT
      A.NO AS ANO
      ,A.CODE AS ACODE
      ,A.AREA AS AAREA
      ,B.NO AS BNO
      ,B.CODE AS BCODE
      ,B.AREA AS BAREA
      ,CASE WHEN A.AREA=B.AREA THEN 'EQUAL' ELSE 'NOT EQUAL' END AS [COMPARE AREA]
      FROM @TBL A
      LEFT JOIN @TBL B
      ON A.NO=B.NO+1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        相关资源
        最近更新 更多