2012-04-04 14 views
1

Ich habe die Abfrage unten, dass wenn es ausgeführt wird, dass 325 Zeilen betroffen waren. Wenn ich jedoch nur den SELECT-Teil der Abfrage ausführe, erhalte ich 331 Ergebnisse. Das heißt, wenn die gesamte Abfrage ausgeführt wird, werden nur 325 Zeilen aktualisiert und nicht 331. Ich bin nicht sicher, was die Abweichung sein könnte. Ich möchte es, alle Zeilen zu aktualisieren, die es in dem SELECT-Teil der AbfrageWie können Sie eine Diskrepanz zwischen zwei Abfragen herausfinden, die unterschiedliche Ergebnisse zurückgeben?

aktualisiert

UPDATE A 
SET 
A.status = X.c 
FROM 
tableA A INNER JOIN (
    SELECT tableB.c_id, COUNT(*) as c 
    FROM tableB 
    LEFT JOIN tableC 
     ON tableB.c_id = tableC.c_id 
    WHERE tableC.c_id != tableC.c_id_update 
    GROUP BY tableB.c_id) X 
ON A.c_id = X.c_id 

und Laufen Dieses Update führt zu 325 Zeilen finden nur der SELECT-Teil der Abfrage gibt 331 Zeilen

Ich bin wirklich fest auf herauszufinden, warum gibt es 6 (331-325) Datensätze, die nicht aktualisiert werden ?! Danke für Ihre Hilfe.

Antwort

1

Es ist wahrscheinlich, dass Ihre Addition zu TableA 6 Datensätze entfernt. Suchen Sie es wie folgt aus:

select x.* from 
(
SELECT tableB.c_id, COUNT(*) as c 
FROM tableB 
LEFT JOIN tableC 
    ON tableB.c_id = tableC.c_id 
WHERE tableC.c_id != tableC.c_id_update 
GROUP BY tableB.c_id 
) X 
left join tableA A on A.c_id = X.c_id 
where A.C_id is null 

Im Wesentlichen ist dies ein LEFT JOIN, und Sie nur die Zeilen zurück, wo der linke Verknüpfung fehlt. Es sollte Ihnen sagen, welche 6 Reihen von Tabelle A

fehlen
0

Jetzt versuchen:

select count(*) 
FROM 
tableA A INNER JOIN (
    SELECT tableB.c_id, COUNT(*) as c 
    FROM tableB 
    LEFT JOIN tableC 
     ON tableB.c_id = tableC.c_id 
    WHERE tableC.c_id != tableC.c_id_update 
    GROUP BY tableB.c_id) X 
ON A.c_id = X.c_id 

Der Unterschied ist die inner join

1

Offensichtlich Ihre innere SELECT-Anweisung 331 Zeilen zurückgibt, von denen 325-tableA über ON A.c_id = X.c_id erfolgreich verbunden wurden. Vermutlich passen 6 der Zeilen, die von Ihrer inneren Auswahl zurückgegeben werden, nicht zu Zeilen in und werden daher gelöscht (da es kein OUTER JOIN ist).

Verwandte Themen