Bagaimana cara saya menempatkan 'jika klausa' dalam string SQL?

190

Jadi inilah yang ingin saya lakukan pada database MySQL saya .

Saya akan melakukan:

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

Jika itu tidak akan mengembalikan baris apa pun, yang dimungkinkan melalui if(dr.HasRows == false), sekarang saya akan membuat UPDATEdalam purchaseOrderdatabase:

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

Bagaimana saya bisa membuat proses ini sedikit lebih pendek?

John Ernest Guadalupe
sumber
4
basis data itemsOrdered memiliki ID unik yang disebut itemsOrdered_IDdan memiliki purchaseOrder_IDnilai berulang
John Ernest Guadalupe
1
yang purchaseorderdatabase pada sisi lain memiliki ID unikpurchaseOrder_ID
John Ernest Guadalupe

Jawaban:

410

Untuk permintaan spesifik Anda, Anda dapat melakukan:

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

Namun, saya mungkin menebak bahwa Anda mengulang pada tingkat yang lebih tinggi. Untuk mengatur semua nilai tersebut, coba ini:

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
                     )
Gordon Linoff
sumber
26
Sebenarnya di MySQL, subquery yang dikorelasikan harus menjadi salah satu pendekatan yang paling efisien, dengan asumsi ada indeks pada itemsOrdered.purchaseOrder_ID.
Gordon Linoff
8
@eggyal. . . Saya setuju bahwa tanpa indeks, versi yang berkorelasi mungkin kurang berkinerja daripada gabungan (tergantung pada berbagai faktor, seperti multiplikasi baris). Namun, dengan indeks, ini harus lebih baik daripada gabungan karena harus menghentikan pemindaian indeks pada pertandingan pertama. Periksa dev.mysql.com/doc/refman/5.5/en/… .
Gordon Linoff
53

Anda dapat menggunakan UPDATEsintaksis multi-tabel untuk menghasilkan ANTI-JOINantara purchaseOrderdan 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
eggyal
sumber
47

Karena MySQL tidak mendukung if exists(*Your condition*) (*Write your query*), Anda dapat mencapai 'jika klausa' dengan menulis seperti ini:

(*Write your insert or update query*) where not exists (*Your condition*)
Ranjit Singh
sumber
27

Anda juga dapat menggunakan kueri berikut untuk memeriksa apakah catatan ada dan kemudian memperbaruinya:

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
Santosh Shirkar
sumber
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)));
sikandar bakht syed
sumber
4
Saya berjuang untuk melihat bagaimana ini menjawab pertanyaan sama sekali?
theMayer
1
@ theMayer Me juga, tapi itu jawaban yang cukup bagus
Gabriel
2
Selamat, Kode Anda telah dipilih sebagai kode yang dikaburkan.
Vishwanath Dalvi
1
Saya kira ini adalah contoh dari apa lagi yang bisa kita lakukan dengan menggunakanSQL
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
CH Hamza Ahmad
sumber
7
alangkah baiknya jika Anda menjelaskan jawabannya juga, jawaban kode saja tidak membantu bagi pengguna di masa mendatang
Kumar Saurabh
8

setelah sql server 2008 menyediakan Mergeuntuk memasukkan, memperbarui, dan menghapus operasi berdasarkan pada pernyataan pertandingan tunggal, juga yang memungkinkan Anda untuk bergabung. contoh contoh di bawah ini mungkin dapat membantu Anda.

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.*;

seperti ini, Anda dapat memasukkan, memperbarui, dan menghapus dalam satu pernyataan.

dan untuk informasi lebih lanjut Anda dapat merujuk dokumen resmi di https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

Lalji Dhameliya
sumber
7

Jika tabel berisi jutaan catatan, maka kueri berikut akan bekerja dengan cepat.

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
Amit Prajapati
sumber
1

Anda bisa mendeklarasikan variabel yang menahan jumlah hasil yang dikembalikan pada kueri pemilihan. Anda kemudian dapat menjalankan pernyataan pembaruan jika variabel ini lebih dari 0

    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'        
Alireza
sumber