仅返回重复数据

Rac*_*SQL 0 sql-server-2008 sql-server

我在整个互联网上搜索堆栈溢出,但我找到的每个示例都只有一行,或者根本不起作用。

我有这张桌子:

TBL_RELATORIOS_TAMANHOS

table_catalog
table_name
column_name
data_type
character_maximum_length
numeric_precision
numeric_scale
Run Code Online (Sandbox Code Playgroud)

在它里面我有所有表中的所有列。我只需要找到那些具有不同精度、大小等的列。

使用 row_number 我得到了这个:

;WITH CTE AS
(
SELECT DISTINCT table_name 'Tabela', 
       column_name 'Coluna',
       character_maximum_length as 'Tamanho', 
       numeric_precision as 'Precisao_Numerica', 
       numeric_scale 'Escala_Numerica'
FROM TBL_RELATORIO_TAMANHOS
)
SELECT *,
    ROW_NUMBER() over ( partition by Tabela,Coluna order by Tabela,Coluna)
FROM CTE
ORDER BY 1,2
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以看到上面有一个的列2,所以这个是重复的(相同的列,不同的大小,精度等)。

| table_Name              | Column_name      | character_maximum_length | numeric_precision | numeric_scale | Row_number |
|-------------------------|------------------|--------------------------|-------------------|---------------|------------|
| ACOES                   | ID_BMF           | 20                       | NULL              | NULL          | 1          |
| ACOES                   | NO_ACAO          | 20                       | NULL              | NULL          | 1          |
| AJUSTE_CODIGO_MITIGADOR | CODIGO_MITIGADOR | 40                       | NULL              | NULL          | 1          |
| AJUSTE_CODIGO_MITIGADOR | CONTA_DLO        | 10                       | NULL              | NULL          | 1          |
| AJUSTE_CODIGO_MITIGADOR | CONTA_DLO        | 25                       | NULL              | NULL          | 2          |
| AJUSTE_CODIGO_MITIGADOR | VALOR_PADRAO     | 1                        | NULL              | NULL          | 1          |
| AJUSTE_POPR             | CD_ELEMENTO      | 10                       | NULL              | NULL          | 1          |
Run Code Online (Sandbox Code Playgroud)

如您所见,CONTA_DLO出现了 2 次。那么,我怎么能只列出那些行数超过 1 的列,但返回所有这些列(所有重复项)。在这种情况下。它应该返回CONTA_DLOrow_number 1 和 2。

ype*_*eᵀᴹ 5

因此,您只想显示有多个具有相同表和列名称的行。

我们可以使用COUNT(*) OVER (PARTITION BY table_name, column_name)计算有多少行具有相同的表和列名,然后WHERE ... >= 2. 还:

  • 我认为你不需要DISTINCT.
  • 如果您确实需要DISTINCT那里,则可以再使用一个 CTE 来应用它,也可以GROUP BY按如下方式使用。
  • 请不要对表和列别名使用单引号。如果需要,请使用方括号或双引号。

查询:

  ;
WITH cte AS
(
    SELECT   
        table_name               AS Tabela, 
        column_name              AS Coluna,
        character_maximum_length AS Tamanho, 
        numeric_precision        AS Precisao_Numerica, 
        numeric_scale            AS Escala_Numerica,
        COUNT(*) OVER (PARTITION BY table_name, column_name) 
                                 AS Count_Duplicates
    FROM TBL_RELATORIO_TAMANHOS
    GROUP BY 
        table_name, column_name,  character_maximum_length,
        numeric_precision, numeric_scale
)
SELECT 
    cte.*,
    ROW_NUMBER() OVER (PARTITION BY Tabela, Coluna) AS Rn
FROM cte
WHERE Count_Duplicates >= 2
ORDER BY Tabela, Coluna, Rn 
  ;
Run Code Online (Sandbox Code Playgroud)