2010-10-13 15 views
2

Disons que j'ai des données de tableau similaire à ce qui suit:Sélectionner toutes les lignes de SQL basée sur l'existence de plusieurs lignes (numéros de séquence)

123456 John Doe 1 Green 2001 
234567 Jane Doe 1 Yellow 2001 
234567 Jane Doe 2 Red 2001 
345678 Jim Doe 1 Red 2001 

Ce que je tente de faire est d'isoler seulement les dossiers de Jane Doe basé sur le fait qu'elle a plus d'une rangée dans cette table. (Plus d'un numéro de séquence) Je ne peux pas isoler en fonction de l'ID, des noms, des couleurs, des années, etc ... Le numéro 1 de la séquence me dit que c'est le premier enregistrement et que je dois pouvoir afficher cet enregistrement, ainsi que l'enregistrement numéro 2 - L'enregistrement de changement.

Si la table s'appelle users, et les champs appelés ID, fname, lname, seq_no, color, date. Comment est-ce que j'écrirais le code pour sélectionner seulement les enregistrements qui ont plus d'une rangée dans cette table? Par exemple:

Je veux la requête pour afficher cette information uniquement sur la base de l'existence des multiples lignes:

234567 Jane Doe 1 Yellow 2001 
234567 Jane Doe 2 Red 2001 

En PL/SQL

Répondre

0

Vérifiez la clause HAVING pour une requête sommaire. Vous pouvez spécifier des choses comme

HAVING COUNT(*) >= 2 

et ainsi de suite.

4

Tout d'abord, pour trouver les ID des enregistrements avec plusieurs lignes que vous utilisez:

SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1 

Ainsi, vous pouvez obtenir tous les dossiers pour toutes les personnes avec

SELECT * FROM table WHERE ID IN (SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1) 

Si vous savez que le l'ID de la deuxième séquence sera toujours "2" et que l'enregistrement "2" ne sera jamais supprimé, vous pourriez trouver quelque chose comme:

SELECT * FROM table WHERE ID IN (SELECT ID FROM table WHERE SequenceID = 2) 

pour être plus rapide, mais vous feriez mieux de vous assurer que les exigences sont satisfaites dans votre base de données (et que vous voulez un index composé sur (SequenceID, ID)).

0

INNER JOIN

REJOIGNEZ:

SELECT u1.ID, u1.fname, u1.lname, u1.seq_no, u1.color, u1.date 
FROM users u1 JOIN users u2 ON (u1.ID = u2.ID and u2.seq_no = 2) 

OÙ:

SELECT u1.ID, u1.fname, u1.lname, u1.seq_no, u1.color, u1.date 
FROM users u1, thetable u2 
WHERE 
    u1.ID = u2.ID AND 
    u2.seq_no = 2 
1

Essayez quelque chose comme ce qui suit. C'est un simple scancan, par opposition à 2 comme les autres.

SELECT * FROM (
    SELECT t1.*, COUNT(name) OVER (PARTITION BY name) mycount FROM TABLE t1 
) 
WHERE mycount >1; 
+0

C'est là que Oracle commence à briller. – kevpie

+0

+1, cependant - il semble que les données aient un "ID de personne" comme première colonne - si cela identifie uniquement une personne, je ferais le COUNT sur cette colonne d'ID à la place (juste au cas où il y aurait deux personnes avec le même nom). –

+0

heh :) en effet, bonne prise sur l'ID de la personne. Oui, vous pouvez facilement remplacer "nom" par "ID de personne". – erbsock