如何比较同一表格中的两行并提供不匹配数据

时间:2019-07-15 12:30:54

标签: sql oracle

我在同一张表中有两个事务,我想比较这两个事务,如果有任何不匹配,它将提供不匹配数据。

        |Col1|Col2|Col3|Col4|
Trans-1 |ABC |123 |321 |111 |
---------------------------------------------------
Trans-2 |ABC |333 |321 |123|

输出:-

        |col2|col4|
Trans-1 |123 |111 |
---------------------------------------------------
Trans-2 |333 |123 |

现在,我可以使用以下命令来获取列值和其他值。但是结果显示为一行,如下所示,每次交易后有没有办法中断该行?

实际:-

Col1| MAX(Col1) |MIN(Col1) |Col2 |MAX(Col2)| MIN(Col2)|
---------------------------------------------------------
same|ABC        |ABC       |diff |123      |321        |

预期:

Col1| MAX(Col1) |MIN(Col1) |
---------------------------
same|ABC        |ABC       |

|Col2 |MAX(Col2)| MIN(Col2)|
----------------------------
|diff |123      |321       |

团队我们在这里犯了大错?猜猜我们是否只有一行,在这种情况下,所有行都将相同,如果只有一个事务,如何实现则应该失败,而不是比较同一事务。

4 个答案:

答案 0 :(得分:1)

您可以尝试通过Col1进行汇总,然后显示所有共享col1值且其他列不一致的记录:

SELECT
    Col1,
    CASE WHEN COUNT(DISTINCT Col2) > 1 THEN 'Col2' END AS Col2_diff,
    CASE WHEN COUNT(DISTINCT Col3) > 1 THEN 'Col3' END AS Col3_diff,
    CASE WHEN COUNT(DISTINCT Col4) > 1 THEN 'Col4' END AS Col4_diff
FROM yourTable
GROUP BY Col1
HAVING
    COUNT(DISTINCT Col2) > 1 OR
    COUNT(DISTINCT Col3) > 1 OR
    COUNT(DISTINCT Col4) > 1;

答案 1 :(得分:0)

您可以将列标记为相同或不同:

select (case when max(col1) = min(col1) and count(col1) = count(*) or
                  max(col1) is null then 'same' else 'diff'
        end) as col1,
       (case when max(col2) = min(col2) and count(col2) = count(*) or
                  max(col2) is null then 'same' else 'diff'
        end) as col2,
       (case when max(col3) = min(col3) and count(col3) = count(*) or
                  max(col3) is null then 'same' else 'diff'
        end) as col3,
       (case when max(col4) = min(col4) and count(col3) = count(*) or
                  max(col4) is null then 'same' else 'diff'
        end) as col4
from t;

请注意,这将返回数据中相同的列。除非您使用动态SQL(PL / SQL中的execute immediate),否则SQL查询会返回一组固定的列。

答案 2 :(得分:0)

比较值并将add_column :products, :parent_id, :integer, null: true, index: true add_foreign_key :products, :products, column: :parent_id 视为常规值(即null = null为TRUE)的一种可能技巧是使用null

DECODE如果值相等则返回1,如果值不同则返回0。

这里有一个示例,返回带有差异的列名

DECODE(value1,value2,1,0)

对于宽表,您可以直接从数据字典中预先生成查询的一部分

这里有个例子:

select 
case when decode(max(col1),min(col1),1,0) = 0 then 'col1 ' end ||
case when decode(max(col2),min(col2),1,0) = 0 then 'col2 ' end ||
case when decode(max(col3),min(col3),1,0) = 0 then 'col3 ' end ||
case when decode(max(col4),min(col4),1,0) = 0 then 'col4 ' end as diff_col_names
from trans

简单地将结果复制并粘贴到查询中。您必须从最后一行删除串联,然后将其替换为列名。

答案 3 :(得分:0)

问题已解决:-

select 'ABC' as COLUMN_NAME,
    (case when  to_char(count(ABC)) >1 and to_char (max(ABC)) = to_char(min(ABC)) and  to_char(count(ABC)) = count(*) 
    and to_char(max(ABC)) is  null then 'same' else 'Diff'end)as COMPARISION_VALUE, 
    (case when to_char(count(ABC))=1 or to_char(min(ABC)) is null then 'No Values' else to_char(max(ABC)) end ) as TRANSACTION1, 
    to_char(min(ABC))as TRANSACTION2
    from AAA where MID ='ASD';