2013-07-11 2 views
-1

Si ce code fonctionnait ce matin, est allé déjeuner, et maintenant il n'affiche pas les bons résultats. Il affiche la quantité correcte de lignes censées apparaître, mais tous les résultats sont des doublons de la première ligne.Code SQL affichant des résultats en double

SELECT 
    client_main.serial, 
    client_main.make, 
    client_main.model, 
    client_deploy.ticket, 
    client_deploy.techID, 
    client_deploy.installDate, 
    client_deploy.updateDate, 
    client_main.status, 
    client_main.type, 
    client_software.operating, 
    client_software.operating_license, 
    client_profile.buildID, 
    client_profile.department, 
    client_main.warrentyStart, 
    client_main.warrentyEnd, 
    client_hardware.cpu, 
    client_hardware.memory, 
    client_hardware.diskSpace1, 
    client_hardware.diskSpace2, 
    client_hardware.diskSpace3, 
    client_software.antivirus, 
    client_software.antivirus_version, 
    client_software.office, 
    client_software.office_license 
FROM 
    client_main, 
    client_deploy, 
    client_hardware, 
    client_network, 
    client_profile, 
    client_software 
WHERE client_main.id = client_deploy.id 
    AND client_deploy.id = client_hardware.id 
    AND client_hardware.id = client_profile.id 
    AND client_profile.id = client_software.id 

MISE À JOUR:

fixe le code en fonction des erreurs relevées. Maintenant, la requête ne montre qu'un seul résultat.

SELECT client_main.serial, client_main.make, client_main.model, client_deploy.ticket, client_main.status, client_software.operating, client_profile.username, client_hardware.cpu, client_hardware.diskSpace3, client_software.antivirus, client_network.ip 

FROM client_main 
inner join client_deploy on client_deploy.id = client_main.id 
inner join client_hardware on client_hardware.id = client_main.id 
inner join client_network on client_network.id = client_main.id 
inner join client_profile on client_profile.id = client_main.id 
inner join client_software on client_software.id = client_main.id 

Résultat Exemple:

serial make model ticket status operating username cpu diskSpace3 antivirus ip 
123 Delld Lattitude1 654897 2 4 dhenning1 13 13 4 2 

Solution Requête:

SELECT client_main.serial, client_deploy.ticket, client_software.operating, client_profile.username, client_hardware.cpu, client_network.ip 
FROM client_main 
INNER JOIN client_deploy ON client_deploy.id = client_main.id 
INNER JOIN client_hardware ON client_hardware.id = client_main.id 
INNER JOIN client_profile ON client_profile.id = client_main.id 
INNER JOIN client_network ON client_network.id = client_main.id 
INNER JOIN client_software ON client_software.id = client_main.id 
+5

Qu'avez-vous mangé au déjeuner? ;) – GolezTrol

+1

@GolezTrol, la même chose qu'il a tous les jours, apparemment. ;) –

+0

Seriez-vous en mesure de fournir des informations sur l'exemple de jeu de résultats que vous obtenez actuellement et un exemple de ce que vous recherchez? –

Répondre

0

Sans connaître votre schéma:

FROM client_main, client_deploy, client_hardware, 
     client_network, client_profile, client_software 

vous choisissez de six tables différentes, mais seulement de rejoindre contre quatre

WHERE client_main.id = client_deploy.id 
    AND client_deploy.id = client_hardware.id 
    AND client_hardware.id = client_profile.id 
    AND client_profile.id = client_software.id 

Il vous manque quelques jointures, c'est la raison pour laquelle vous obtenez des résultats en double.

+0

D'accord.Correction de cette partie du code. Commencé à coder et parti sans terminer avant le déjeuner. Problème maintenant, c'est qu'il ne montre qu'un seul résultat avec ce code: – Drifterhawk

+0

@Drifterhawk nous donner un violon SQL du problème. – Woot4Moo

+0

Il manquait une jointure avec le client_network et la table des logiciels était également foirée. Je vous remercie! – Drifterhawk

1

Votre requête serait plus claire si vous utilisez la syntaxe SQL92 pour JOIN:

SELECT m.serial, m.make, m.model, d.ticket, d.techID, d.installDate, d.updateDate, 
    m.status, m.type, s.operating, s.operating_license, p.username, p.buildID, 
    p.department, m.warrentyStart, m.warrentyEnd, h.cpu, h.memory, h.diskSpace1, 
    h.diskSpace2, h.diskSpace3, s.antivirus, s.antivirus_version, s.office, 
    s.office_license 
FROM client_main AS m 
INNER JOIN client_deploy AS d ON m.id = d.id 
INNER JOIN client_hardware AS h ON d.id = h.id 
INNER JOIN client_network AS n ON ...wait woops?!... 
INNER JOIN client_profile AS p ON h.id = p.id 
INNER JOIN client_software AS s ON p.id = s.id 

Il n'y a pas condition dans votre requête pour la jointure à client_network. Vous générez donc un Cartesian product, en multipliant le nombre de lignes par client_network par le nombre de lignes résultant des autres tables jointes. Pour ce qui est de savoir pourquoi cela n'a pas posé de problème avant d'aller déjeuner, s'il n'y avait qu'une seule ligne à client_network avant le déjeuner, alors le produit cartésien ne serait pas apparent. Je suppose que vous ou quelqu'un d'autre a ajouté quelques lignes supplémentaires à client_network pendant ou après le déjeuner.

PS: Je suis d'accord avec le commentaire de @ GolezTrol, il semble peu probable que la bonne colonne à se joindre à id est en tous de ces tables.

Questions connexes