ฉันจะอัปเดตขณะเข้าร่วมตารางบน SQLite ได้อย่างไร


92

ฉันเหนื่อย :

UPDATE closure JOIN item ON ( item_id = id ) 
SET checked = 0 
WHERE ancestor_id = 1

และ:

UPDATE closure, item 
SET checked = 0 
WHERE ancestor_id = 1 AND item_id = id

ทั้งสองใช้งานได้กับ MySQL แต่สิ่งเหล่านี้ทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์ใน SQLite

ฉันจะทำให้ UPDATE / JOIN นี้ทำงานกับ SQLite เวอร์ชัน 3.5.9 ได้อย่างไร


มีคำตอบแล้วโดยstackoverflow.com/questions/3845718/…
Gad D Lord

คำตอบ:


129

คุณทำไม่ได้ SQLite ไม่สนับสนุนร่วมในงบ UPDATE

แต่คุณสามารถทำได้โดยใช้แบบสอบถามย่อยแทน:

UPDATE closure SET checked = 0 
WHERE item_id IN (SELECT id FROM item WHERE ancestor_id = 1);

หรืออะไรทำนองนั้น; ยังไม่ชัดเจนว่าสคีมาของคุณคืออะไร


20
สิ่งนี้ทำให้เกิดความยุ่งยากเมื่อสิ่งที่คุณต้องทำคือคัดลอกคอลัมน์จากตารางหนึ่งไปยังอีกตารางหนึ่งเพื่อย้อนกลับทิศทางของการเชื่อมโยง ใน MySQL คุณสามารถทำอะไรได้บ้างเช่นสร้างคอลัมน์ foos.bar_id จากupdate foos join bars on bars.foo_id = foos.id set foos.bar_id = bars.idนั้นวางคอลัมน์ bars.foo_id ... สิ่งนี้จะทำได้อย่างไรใน SQLite หากใครรู้ฉันสามารถใช้มันได้อย่างแน่นอน
hoff2

@ hoff2 จริงๆแล้วนี่อาจเป็นวิธีที่ง่ายที่สุดในการทำเช่นนี้ ในกรณีของฉันฉันไม่จำเป็นต้องใช้ WHERE EXISTS part: stackoverflow.com/a/3845931/847201
ACK_stoverflow

7

คุณยังสามารถใช้REPLACEจากนั้นคุณสามารถใช้การเลือกกับการรวม แบบนี้:

REPLACE INTO clusure 
 SELECT sel.col1,sel.col2,....,sel.checked --checked should correspond to column that you want to change
FROM (
 SELECT *,0 as checked FROM closure LEFT JOIN item ON (item_id = id) 
 WHERE ancestor_id = 1) sel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.