2017-10-14 10 views
0

Je suis à la fin de mes connaissances SQL. J'ai le problème que je veux vérifier l'existence si deux tables ont le même nombre de rangées.SQL: Lorsque cela existe -> Comparer deux tables et vérifier si elles ont le même nombre de lignes

Un exemple pourrait être que je veux montrer à toutes les écoles où le nombre de chaises est le même nombre d'élèves. Mon pseudo code ressemble à ceci:

SELECT * FROM schools WHERE 
    ((SELECT COUNT(*) FROM students) = (SELECT COUNT(*) FROM chairs)); 

ou avec un pseudo-calcul: students - chairs = 0;

SELECT * FROM schools WHERE 
    ((SELECT COUNT(*) FROM students) - (SELECT COUNT(*) FROM chairs) = 0); 

Une telle construction avec SQL est-elle possible et si oui comment?

Répondre

2

Votre approche semble un peu peu orthodoxe, mais vous pouvez le faire avec les sous-requêtes corrélées:

SELECT s.* 
FROM schools s. 
WHERE ((SELECT COUNT(*) FROM students st WHERE st.school_id = s.school_id) = 
     (SELECT COUNT(*) FROM chairs c WHERE c.school_id = s.school_id) 
    ); 

je serais plus enclin à faire une jointure après l'agrégation:

select st.school_id 
from (SELECT st.school_id, COUNT(*) as cnt 
     FROM students st 
     GROUP BY st.school_id 
    ) st JOIN 
    (SELECT c.school_id, COUNT(*) as cnt 
     FROM chairs c 
     GROUP BY c.school_id 
    ) c 
    ON st.school_id = c.school_id AND st.cnt = c.cnt; 

Les deux versions sont subtilement différent. Cette version ne retournera que les identifiants d'école qui ont au moins un étudiant (et une chaise).

EDIT:

Je dois souligner que si vous voulez juste savoir si deux tableaux ont le même nombre de lignes, vous pouvez retourner un booléen dans le SELECT:

SELECT ((SELECT COUNT(*) FROM chairs c) = 
     (SELECT COUNT(*) FROM students st) 
     ) as num_rows_same_flag 

En raison de la présence de la table schools, cependant, je suppose que vous voulez les écoles avec le même nombre de chaque.

+0

Bonjour Gordon, merci pour votre réponse, vous m'avez beaucoup aidé à comprendre. À votre dernière phrase: je veux seulement montrer aux écoles où le nombre de chaises et d'étudiants est le même. – Martin

+0

@Martin. . . C'est ce à quoi je m'attendais. Cependant, le titre de votre question suggère que vous faites référence à la table entière (pas seulement chaque école), donc j'ai ajouté la modification. –

+0

Merci encore pour votre aide, j'ai maintenant modifié mon code et cela fonctionne comme prévu. – Martin