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_DLO
row_number 1 和 2。
因此,您只想显示有多个具有相同表和列名称的行。
我们可以使用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)