2012-12-21 6 views
135

Also hier ist was ich auf meiner MySQL Datenbank tun möchte.Wie lege ich eine 'if-Klausel' in eine SQL-Zeichenfolge?

möchte ich mag:

SELECT * 
    FROM itemsOrdered 
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID' 
     AND status = 'PENDING' 

Wenn das wäre keine Zeilen zurück, die durch if(dr.HasRows == false) möglich ist, würde ich jetzt eine UPDATE in der purchaseOrder Datenbank erstellen:

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID' 

Wie würde Kann ich diesen Prozess ein wenig kürzer machen?

+4

die itemsOrdered Datenbank hilft hat eine eindeutige ID namens 'itemsOrdered_ID' und wiederkehrende' purchaseOrder_ID' Werte –

+1

die 'purchaseorder' Datenbank auf der anderen Seite hat die eindeutige ID' purchaseOrder_ID' –

Antwort

288

Für Ihre spezifische Abfrage, können Sie tun:

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID' and 
      not exists (SELECT * 
         FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING' 
        ) 

Allerdings könnte ich denke, dass man auf einem höheren Niveau sind Looping. Um alle solche Werte eingestellt, versuchen Sie dies:

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE not exists (SELECT 1 
         FROM itemsOrdered 
         WHERE itemsOrdered.purchaseOrder_ID = purchaseOrder.purchaseOrdered_ID AND 
          status = 'PENDING' 
         limit 1 
        ) 
+18

Eigentlich sollte die korrelierte Unterabfrage in MySQL zu den effizientesten Ansätzen gehören, vorausgesetzt, es gibt einen Index für itemsOrdered.purchaseOrder_ID. –

+5

@eggyal. . . Ich stimme zu, dass ohne einen Index die korrelierte Version vielleicht weniger leistungsfähig ist als der Join (hängt von verschiedenen Faktoren ab, wie z. B. der Multiplikation von Zeilen). Mit einem Index sollte es jedoch besser sein als ein Join, da es den Index-Scan bei der ersten Übereinstimmung stoppen sollte. Überprüfen Sie http://dev.mysql.com/doc/refman/5.5/en/subquery-optimization-with-exists.html. –

41

Sie können die Multi-Table UPDATE Syntax verwenden, um zu bewirken eine ANTI-JOIN zwischen purchaseOrder und itemsOrdered:

UPDATE purchaseOrder p LEFT JOIN itemsOrdered i 
    ON p.purchaseOrder_ID = i.purchaseOrder_ID 
    AND i.status = 'PENDING' 
SET p.purchaseOrder_status = 'COMPLETED' 
WHERE p.purchaseOrder_ID = '@purchaseOrder_ID' 
    AND i.purchaseOrder_ID IS NULL 
37

Da MySQL nicht if exists(*Your condition*) (*Write your query*) nicht unterstützt, erreichen kann, eine 'if-Klausel' durch wie folgt zu schreiben:

(*Write your insert or update query*) where not exists (*Your condition*) 
14
Select FROM t1 
    WHERE s11 > ANY 
     (SELECT col1,col2 FROM t2 
      WHERE NOT EXISTS 
       (SELECT * FROM t3 
        WHERE ROW(5*t2.s1,77)= 
         (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM 
          (SELECT * FROM t5) AS t5))); 
+3

Ich kämpfe um zu sehen, wie das die Frage überhaupt beantwortet? – theMayer

+1

@theMayer Ich auch, aber es ist eine ziemlich schöne Antwort – Gabriel

18

Sie können auch die folgende Abfrage überprüfen verwenden, wenn der Datensatz vorhanden ist und es dann aktualisieren:

if not exists(select top 1 fromFROM itemsOrdered 
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID' 
     AND status = 'PENDING') 
Begin 

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID 

End 
6
if not exists(select top 1 fromFROM itemsOrdered 
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID' 
     AND status = 'PENDING') 
Begin 

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID 

End 
+6

es wird toll sein, wenn Sie die Antwort auch erklären, Code nur Antworten sind nicht hilfreich für zukünftige Benutzer –

Verwandte Themen