Eu quero obter apenas linhas com valores diferentes em uma coluna (nome da coluna DEF) com base nas linhas duplicadas com combinação exclusiva de outras 3 colunas.
Exemplo: No exemplo abaixo, as duas primeiras linhas têm o mesmo valor para as 3 primeiras colunas. Mas elas têm valores diferentes para a coluna DEF. Portanto, ambas as linhas serão listadas na saída.
Mas as linhas 2 e 4 têm uma combinação única para as 3 primeiras colunas, mas têm os mesmos valores na coluna DEF. Portanto, não devem ser listadas na saída.
as linhas 5 e 6 não devem ser listadas, pois são uma única linha com valores diferentes.
+----------+-------+--------+--------+
| dept | role1 |role2 |DEF |
+----------+-------+--------+--------+
| a | abc | er | 0 |
| a | abc | er | 1 |
| b | qwer | ty | 0 |
| b | qwer | ty | 0 |
| c | der | ui | 1 |
| d | nerr | io | 0 |
+----------+-------+--------+--------+
output
+----------+------+------+------+
| dept | role1|role2 |DEF |
+----------+------+------+------+
| a | abc | er |0 |
| a | abc | er |1 |
+----------+------+------+------+
Tentei usar distinct com mas não consegui verificar os valores da coluna DEF para obter o resultado desejado.
Alguém pode me ajudar nisso?
Usando SQL padrão na maioria dos RDBMS, existem várias maneiras.
Usando uma subconsulta:
A subconsulta retorna conjuntos de
dept/role1/role2
com mais de 1 distinctDEF
.Usando uma subconsulta correlacionada:
A subconsulta retorna de 0 a n linhas. Se existir pelo menos uma linha, a linha da tabela principal será retornada.
Usando
CROSS APPLY
:CROSS APPLY funciona com Oracle ou SQL Server.
Resultado: