2011-05-02 6 views
3

traitement (StaffNo, PatientID, StartDate, Reason)De algèbre relationnelle SQL

Trouvez les effectifs de tous les médecins qui traitent tous les patients traités par le médecin dont le numéro personnel est 603.

En algèbre relationnelle

Divide (traitement du projet Au cours StaffNo, PatientId) Par projet (Choisir le traitement Où StaffNumber = '603') sur PatientId

Je le veux en SQL, s'il vous plaît.

Est-ce SQL droit?

SELECT DISTINCT staff_no 
FROM treatment AS t1 
WHERE NOT EXISTS (SELECT * 
        FROM treatment as s2 
        WHERE s2.staff_no = '603' 
        AND NOT EXISTS (SELECT * 
            FROM treatment AS t3 
            WHERE t1.staff_no = t3.staff_no 
             AND t3.patient_id = s2.patient_id)); 
+0

See http://www.simple-talk.com/sql/t-sql-programming/divided-we-stand-the-sql-of-relational-division/ –

+1

'Je veux dans SQL , s'il vous plaît. »n'est pas une question. Dites-nous ce que vous avez essayé et où vous avez des problèmes. Si vous n'obtenez rien de tout cela, il semble que vous deviez revenir à l'essentiel. – mellamokb

+0

Je veux en USD, mais ce n'est pas vraiment ce que ce site est pour. Voir la [FAQ] (http://stackoverflow.com/faq) –

Répondre

0

Il n'y a pas de traduction directe de l'algèbre relationnelle SQL, comme SQL est plus analogue à calcul relationnel. L'algèbre relationnelle est procédurale; vous définissez comment pour obtenir les données que vous voulez. Le calcul relationnel (et SQL) définit quelles données vous voulez, et laisse l'implémentation jusqu'au SGBDR. Cela étant dit, il n'y a pas d'équivalent de l'opérateur de division de l'algèbre relationnelle dans SQL. Vous devrez énoncer ce que vous voulez plus clairement. En guise de note, les questions liées au travail scolaire sont fortement encouragées pour le rendre clair (et puisque cette question concerne l'algèbre relationnelle, je soupçonne que c'est le cas); si c'est pour l'école, soyez honnête à ce sujet.

+0

Ok, Forget Algebra relationnelle. Je veux cette requête "Trouver les numéros de personnel de tous les médecins qui traitent tous les patients traités par le médecin dont le numéro de personnel est 603" en SQL. Traitement de table (StaffNo, PatientID, StartDate, Reason) – Prince

+0

Aucun opérateur intégré mais double 'n'existe pas 'ou' groupe par' et 'count' peut faire le travail http://www.simple-talk.com/sql/ t-sql-programming/split-we-stand-the-sql-of-division-relationnelle/ –

+0

@Martin: Notez que j'ai dit qu'il n'y avait pas de traduction directe, pas que le même résultat était impossible. Alors que ce que vous suggérez est une solution polyvalente, avoir plus d'informations (comme le PO a fourni) peut souvent aboutir à une solution plus claire et plus optimisée. –

1

Merci à tous pour votre aide.

J'ai trouvé la réponse.

Ce SQL est de manière informelle équivalent à la division relationnelle.

SELECT DISTINCT staff_no 
FROM treatment AS t1 
WHERE NOT EXISTS (SELECT * 
        FROM treatment as s2 
        WHERE s2.staff_no = '603' 
        AND NOT EXISTS (SELECT * 
            FROM treatment AS t3 
            WHERE t1.staff_no = t3.staff_no 
             AND t3.patient_id = s2.patient_id)); 
Questions connexes