2008-12-24 8 views
0

Je récupère trois ensembles de données différents (ou ce qui devrait être des lignes "uniques"). Au total, je m'attends à 3 ensembles de lignes uniques parce que je dois effectuer différentes opérations sur chaque ensemble de données. Cependant, je récupère plus de lignes qu'il n'y en a au total dans la table, ce qui signifie que je dois récupérer des lignes en double quelque part. Voici un exemple de mes trois séries de requêtes:Interrogation de trois ensembles de données non bissecteurs

SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
      AND t2.NAME = t1.NAME 
      AND t2.ADDRESS <> t1.ADDRESS 


SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
      AND t2.NAME <> t1.NAME 
      AND t2.ADDRESS <> t1.ADDRESS 


SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID <> t1.ID 
      AND t2.NAME = t1.NAME 
      AND t2.ADDRESS <> t1.ADDRESS 

Comme vous pouvez le voir, je suis sélection (dans l'ordre des requêtes)

  • ensemble de données où le match d'identification et le nom
  • ensemble de données où les matches id mais le nom ne pas
  • ensemble de données où l'identification ne correspond pas, mais le nom ne

I a m récupérant PLUS de lignes qu'il n'en existe dans T1 en additionnant le nombre de résultats renvoyés par les trois requêtes, ce qui ne me semble pas logique, et je dois donc dupliquer les lignes (si c'est logiquement possible) quelque part qui m'empêche de exécuter des commandes différentes pour chaque ensemble (puisqu'une rangée aurait une autre commande exécutée dessus). Est-ce que quelqu'un peut trouver où je me trompe ici?

+0

Il pourrait être utile de vous expliquer ce que vous faites et pourquoi je regarde cela et je me dis «que feriez-vous? – cletus

Répondre

2

Considérez si Nom est pas unique. Si vous avez les données suivantes:

Table 1      Table 2 
ID Name  Address  ID Name  Address 
0  Jim Smith 1111 A St  0  Jim Smith 2222 A St 
1  Jim Smith 2222 B St  1  Jim Smith 3333 C St 

Puis requête 1 vous donne:

0  Jim Smith 1111 A St 
1  Jim Smith 2222 B St 

Parce que les lignes 1 & 2 dans le tableau 1 lignes de match 1 & 2, respectivement dans le tableau 2.

La requête 2 ne vous donne rien.

Requête 3 vous donne

0  Jim Smith 1111 A St 
1  Jim Smith 2222 B St 

Parce que la ligne 1 du tableau 1 correspond à la ligne 2 dans le tableau 2 et la ligne 2 du tableau 1 correspond à la ligne 1 dans le tableau 2. Ainsi, vous obtenez 4 lignes sur le tableau 1 lorsque il n'y a que 2 lignes dedans.

+0

Ces adresses semblent correspondre. N'y aurait-il pas de zéro résultat pour tous? – recursive

+0

Erreur de copier/coller. Fixé maintenant – tvanfosson

+0

Ah, mon erreur était de penser qu'il ne retournerait qu'une ligne du tableau 1, bien qu'il y ait une correspondance pour une autre ligne avec les mêmes données dans le tableau 2. – Organiccat

1

Êtes-vous sûr que NAME et ID sont uniques dans les deux tables?

Sinon, vous pourriez avoir une situation, par exemple, où le tableau 1 a ceci:

NOM: Fred ID: 1

et table2 a ceci:

NOM: Fred ID: 1

NOM: Fred ID: 2

dans ce cas, le dossier en table1 sera renvoyé par deux de vos requêtes: ID et NAME correspondent tous deux, et NAME correspond mais pas ID.

Vous pourriez être en mesure de cerner le problème en croisant chaque combinaison de deux requêtes pour savoir ce que les doublons sont, par exemple:

SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
       AND t2.NAME = t1.NAME 
       AND t2.ADDRESS <> t1.ADDRESS 
INTERSECT 
SELECT DISTINCT t1.* 
    FROM table1 t1 
    INNER JOIN table2 t2 
     ON t2.ID = t1.ID 
       AND t2.NAME <> t1.NAME 
       AND t2.ADDRESS <> t1.ADDRESS 
+0

Le nom et l'ID ne sont PAS uniques dans les deux tables, et c'est le cas exact que j'ai trouvé après avoir utilisé Intersect. Le tableau 1 a une valeur "unique", mais la table 2 a deux résultats possibles pour cela. J'ai une valeur unique dans chaque table (je suis en train de mailler deux tables similaires) que je pense pouvoir utiliser. – Organiccat

0

Je pense que la dernière requête pourrait être celui aller chercher ensemble supplémentaire de lignes

à-dire qu'il compte sur correspondance des noms dans les deux tables (et non sur ID)

1

En supposant que T2.ID a une contrainte unique, il est encore tout à fait logiquement possible pour que ce scénario occur.If pour chaque enregistrement en T1, il y a deux enregistrements correspondants dans T2:

  1. Même nom, même identifiant, adresse différente
  2. nom même, différent id, adresse différente

Puis le même enregistrement pour T1 peut venir dans la première et la troisième requête par exemple.

Il est également possible d'obtenir simultanément la même ligne dans les deuxième et troisième requêtes.

S'il n'est pas garanti que T2.ID soit unique, vous pouvez obtenir la même ligne à partir de T1 dans les trois requêtes.

0

Pour trouver les données incriminées (et aider à trouver votre trou logique) Je recommande:

(attention pseudo-code)

Limiter les résultats à id juste SELECT DE ....

  • UNION définit le résultat

  • COUNT (id)

  • GROUP BY id

  • HAVING COUNT (id)> 1

Cela montrera les enregistrements qui correspondent à plus d'une sous-requête.

Questions connexes