SQL dizesine 'if deyimi' nasıl koyabilirim?


190

İşte MySQL veritabanımda yapmak istediğim şey .

Yapmak istiyorum:

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

O aracılığıyla mümkündür tüm satırları, dönmek olmaz ise if(dr.HasRows == false), ben artık yaratacak UPDATEiçinde purchaseOrderveritabanı:

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

Bu süreci nasıl biraz daha kısa hale getirebilirim?


4
itemsOrdered veritabanı benzersiz bir kimliğe itemsOrdered_IDsahiptir ve yinelenen purchaseOrder_IDdeğerleri vardır
John Ernest Guadalupe

1
purchaseorderÖte yandan veritabanı benzersiz kimliği vardırpurchaseOrder_ID
John Ernest Guadalupe

Yanıtlar:


410

Özel sorgunuz için şunları yapabilirsiniz:

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'
                     )

Ancak, daha yüksek bir seviyede döngü yaptığınızı tahmin edebilirim. Bu tür tüm değerleri ayarlamak için şunu deneyin:

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
                     )

26
Aslında MySQL'de, itemsOrdered.purchaseOrder_ID üzerinde bir dizin olduğu varsayılarak, ilişkili alt sorgu en verimli yaklaşımlar arasında olmalıdır.
Gordon Linoff

8
@eggyal. . . Bir indeks olmadan ilişkili versiyonun belki de birleştirmeden daha az performans gösterdiğini kabul ediyorum (satırların çarpımı gibi çeşitli faktörlere bağlıdır). Bununla birlikte, bir indeks ile birleştirme işleminden daha iyi olmalıdır, çünkü ilk maçta indeks taramayı durdurmalıdır. Dev.mysql.com/doc/refman/5.5/en/… adresini kontrol edin .
Gordon Linoff

53

Ve arasında UPDATEbir efekt oluşturmak için çoklu tablo sözdizimini kullanabilirsiniz :ANTI-JOINpurchaseOrderitemsOrdered

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

47

MySQL desteklemediğinden if exists(*Your condition*) (*Write your query*), şöyle yazarak bir 'if cümlesi' elde edebilirsiniz:

(*Write your insert or update query*) where not exists (*Your condition*)

27

Kaydın var olup olmadığını kontrol etmek ve güncellemek için aşağıdaki sorguyu da kullanabilirsiniz:

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

22
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)));

4
Bunun soruyu nasıl yanıtladığını görmek için uğraşıyorum?
Mayıs

1
@theMayer Ben de ama çok güzel bir cevap
Gabriel

2
Tebrikler, Kodunuz gizli bir kod olarak seçildi.
Vishwanath Dalvi

1
Sanırım bu başka neler yapabileceğimize bir örnekSQL
Top-Master

13
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

7
u yanıtı da açıklarsanız harika olacak, sadece kod cevapları gelecekteki kullanıcılar için yararlı değildir
Kumar Saurabh

9

sql server 2008'den sonra Merge, tek eşleme deyimine dayalı ekleme, güncelleme ve silme işlemi sağlamanıza izin verir, ayrıca katılmanıza izin verir. Aşağıdaki örnek örnek size yardımcı olabilir.

MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID) 
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%' 
    THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED 
    THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
    THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;

bunun gibi bir ifadeye ekleyebilir, güncelleyebilir ve silebilirsiniz.

ve daha fazla bilgi için https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx adresindeki resmi belgelere başvurabilirsiniz.


7

Tablo milyonlarca kayıt içeriyorsa, aşağıdaki sorgu hızlı çalışır.

UPDATE PO
SET PO.purchaseOrder_status = 'COMPLETED'
FROM purchaseOrder PO
LEFT OUTER JOIN itemsOrdered IOD ON IOD.purchaseOrder_ID = PO.purchaseOrdered_ID and IOD.status = 'PENDING'
WHERE IOD.purchaseOrder_ID IS NULL

1

Seçme sorgusunda döndürülen sonuç sayısını tutan bir değişken bildirebilirsiniz. Daha sonra bu değişken 0'dan büyükse update deyimini çalıştırabilirsiniz

    Declare @ResultCount int
    SELECT @ResultCount = count(*) FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING'        
    If @ResultCount > 0
UPDATE purchaseOrder SET purchaseOrder_status = 'COMPLETED' WHERE purchaseOrder_ID = '@purchaseOrder_ID'        
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.