Saya ingin memperbarui tabel target (target) menurut baris dalam tabel sumber (source). Untuk itu, saya menggunakan pernyataan MERGE . Namun, saya ingin seluruh MERGE operasi gagal pada beberapa kondisi, tetapi tidak tahu bagaimana melakukannya.

Contoh

Tabel target berisi :

id
==
1
2

Tabel source berisi :

id | operation
==============
3  | ADD
4  | DELETE

Tabel target yang diharapkan setelah MERGE (Saya tidak ingin ada pembaruan di sini karena 4 sesuai dengan operasi DELETE, dan karena tidak ada 4 pada tabel target, ini dianggap sebagai kesalahan dan MERGE harus gagal secara atom):

id
==
1
2

Sampai sekarang, saya menggunakan permintaan berikut:

MERGE `target` target
USING `source` source
ON target.id = source.id
WHEN not matched AND source.operation = "ADD" THEN
  INSERT (id)
  VALUES (source.id)

Tapi jelas, saya mendapat:

id
==
1
2
3

Apakah mungkin untuk menambahkan dalam kueri saya klausa seperti:

WHEN not matched AND source.operation = "DELETE" THEN ERROR("...")

Ini tidak berfungsi (ERROR tidak terduga):

Kesalahan sintaks: Kata kunci yang diharapkan DELETE atau kata kunci INSERT atau kata kunci UPDATE tetapi mendapat pengenal "ERROR"

Jika ini tidak memungkinkan dengan kueri MERGE, apakah ada cara untuk menulis ulang ke kueri serupa untuk memperbarui secara atom tabel target saya seperti yang saya harapkan?

0
norbjd 5 Maret 2019, 15:19

1 menjawab

Jawaban Terbaik

Anda bisa menghasilkan kesalahan sendiri. Sesuatu seperti:

WHEN not matched AND source.operation = 'DELETE' THEN 
    INSERT (id)
       VALUES ( CAST(source.operation as int64) )

Saya tidak sengaja mencoba menghasilkan kesalahan di BigQuery, tetapi saya rasa tidak ada fungsi yang melakukannya secara otomatis.

Seperti yang diusulkan oleh @norbjd:

WHEN not matched AND source.operation = 'DELETE' THEN 
    INSERT (id)
       VALUES ( ERROR('ERROR:  DELETE operation encountered') )
1
Gordon Linoff 5 Maret 2019, 14:11