2016-04-21 16 views
1

Ich habe Probleme mit einer bestimmten Abfrage zu arbeiten. Ich weiß, dass ich so nah bin. Hier ist ein copy of my er diagramsql beitreten und minus

Ich denke, ich bin so kurz davor zu erreichen, was ich mit diesem Code machen möchte, nur bekomme ich ungültige Kennung, wenn Sie versuchen, es auszuführen. Ich denke es ist, weil die Praxis irgendwie nach dem Beitritt geändert wird, da ich nur eine ungültige Kennung in Zeile 5 bekomme?

SELECT staffid, staff_firstname, staff_surname, practice.practice_name, practice.practice_city 
from staff 
join practice on staff.practiceid = practice.practiceid 
MINUS 
SELECT staffid, staff_firstname, staff_surname, practice.practice_name, practice.practice_city 
from staff 
where role = 'GP'; 

Grundsätzlich Ich versuche, das Minus-Konstrukt zu verwenden Praktiken zu finden, die keine GP beschäftigen und umfassen einige Informationen wie die Stadt und practice_address.

kann ich das Minus Konstrukt verwenden, um herauszufinden, wie viele Mitarbeiter haben nicht die Rolle der GP wie so:

SELECT staffid, staff_firstname, staff_surname 
from staff 
MINUS 
SELECT staffid, staff_firstname, staff_surname 
from staff 
where role = 'GP'; 

, wo ich die Ergebnisse erhalten:

STAFFID STAFF_FIRS STAFF_SURN 
__________ __________ __________ 
     8 NYSSA  THORNTON 
     9 MONA  BRADSHAW 
     10 GLORIA  PENA 

Ich bin zu kämpfen um die Verbindung mit dem Minus-Konstrukt zu verwenden, um Informationen über die Praxisadresse und die Stadt usw. des GP zu erhalten.

Jede Hilfe würde sehr geschätzt werden!

+0

Die sekundäre Abfrage, nach dem Minus, wird nicht mit der Übungstabelle verbunden? –

+0

Wow ... danke haha! – user3357649

Antwort

2

Die zweite Auswahl nach dem Minus, beziehe sich auf den Spalten aus der Praxis Tisch - aber es kommt nicht zu ihm:

SELECT staffid, staff_firstname, staff_surname, 
    practice.practice_name, practice.practice_city 
from staff 
join practice on staff.practiceid = practice.practiceid 
MINUS 
SELECT staffid, staff_firstname, staff_surname, 
    practice.practice_name, practice.practice_city 
from staff 
join practice on staff.practiceid = practice.practiceid 
where role = 'GP'; 

Das wollen Sie nicht, was Sie wollen, obwohl, Es werden nur die Zeilen für Mitarbeiter entfernt, die GPs sind, und nicht alle Methoden von Praxen, die über GPs verfügen. Nicht-GP-Mitarbeiter in allen Praxen werden weiterhin angezeigt.

Wenn Sie die restlichen Mitarbeiterdetails nicht möchten, müssen Sie nur die Spalten aus der Übungstabelle in die Auswahllisten aufnehmen, und das Minus würde Ihnen dann geben, was Sie wollen (und Gordon Linoff hat zwei Alternativen zu minus gezeigt In diesem Fall). Wenn Sie die verbleibenden Mitarbeiter Details wollen, dann können Sie eine Klausel nicht-existiert verwenden, anstatt einen minus - so etwas wie:

select s.staffid, s.staff_firstname, s.staff_surname, 
    p.practice_name, p.practice_city 
from staff s 
join practice p on s.practiceid = p.practiceid 
where not exists (
    select 1 
    from staff s2 
    where s2.practice_id = p.practice_id 
    and s2.role = 'GP 
); 

Diese Gordons zweite Abfrage ähnlich ist, aber ein extra staff für die Details verbinden. Wenn Sie diese nicht möchten, verwenden Sie Gordons einfachere Abfrage.

Sie könnten auch eine Aggregatprüfung verwenden, oder Sie könnten wahrscheinlich etwas mit einer analytischen Funktion tun, wenn Sie gelernt haben, diese zu drücken, um zu sparen, zweimal die Tabellen zu treffen.

+0

Wie würde ich eine nicht existierende Aussage dafür verwenden? Ersetzen Sie das Minus durch Nicht vorhanden und setzen Sie Klammern um die Select-Anweisung? – user3357649

+0

@ user3357649 - eine grobe nicht existierende Version hinzugefügt. –

1

Ihre ursprüngliche Abfrage funktioniert nur auf der Ebene von "Personal", nicht "Praxis". Ich würde geneigt sein, diese unter Verwendung von Aggregation zu lösen:

select p.practice_name, p.practice_city 
from staff s join 
    practice p 
    on s.practiceid = p.practiceid 
group by p.practice_name, p.practice_city 
having sum(case when s.role = 'GP' then 1 else 0 end) = 0; 

Oder, noch besser:

select p.* 
from practice p 
where not exists (select 1 
        from staff s 
        where s.practiceid = p.practiceid and s.role = 'GP' 
       ); 

Ich denke, dies ist die einfachste und direkteste Interpretation Ihrer Frage.