it-swarm-eu.dev

SQL Retourne uniquement les lignes en double

J'ai une requête qui renvoie les lignes suivantes:

StateId, OrderId, OrderTime, PermitId

Je dois renvoyer uniquement les lignes qui sont des doublons exacts partout dans le tableau, donc chaque enregistrement doit être exactement le même que l'autre enregistrement pour qu'il soit en double. Je voudrais retourner les deux enregistrements. Ces reocrds sont mélangés à un tas de disques qui n'ont pas de doublons ...

Une idée?

37
user380432

Identifiez d'abord les doublons. Ensuite, rejoignez-nous pour extraire ces lignes.

Une auto-jointure non agrégée (ou non-fenêtre/classement) forme une jointure croisée partielle et donne le carré des doublons pour n'importe quel ensemble de clés. Y compris les non-doublons aussi. 1 x 1 = 1 après tout.

SELECT
    t2.*
FROM
    (
    SELECT 
       StateId, OrderId, OrderTime, PermitId
    FROM
       myTable
    GROUP BY
       StateId, OrderId, OrderTime, PermitId
    HAVING
       COUNT(*) >= 2
    ) T1
    JOIN
    mytable T2 ON T1.StateId = T2.StateId AND T1.OrderId = T2.OrderId AND
                   T1.OrderTime = T2.OrderTime AND T1.PermitId = T2.PermitId
55
gbn

En général, si vous essayez simplement de voir quelles lignes ont des doublons pour ces valeurs ...

SELECT StateId, OrderId, OrderTime, PermitId, COUNT(*) FROM Foo
GROUP BY StateId, OrderId, OrderTime, PermitId
HAVING COUNT(*) > 1
14
Brosto

Une possibilité si votre serveur de base de données prend en charge les sous-requêtes:

select * from your_table
 where (StateId, OrderId, OrderTime, PermitId) in
  ( select StateId, OrderId, OrderTime, PermitId
      from your_table
     group by StateId, OrderId, OrderTime, PermitId
    having count(1) > 1 )
7
Pablo Santa Cruz