จะเขียน UPDATE SQL ด้วย alias Table ใน SQL Server 2008 ได้อย่างไร?


213

ฉันมีพื้นฐานมากUPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

แบบสอบถามนี้จะทำงานได้ดีในOracle, Derby, MySQL- แต่ก็ล้มเหลวใน SQL Server 2008 ด้วยข้อผิดพลาดต่อไปนี้:

"ข่าวสารเกี่ยวกับ 102, ระดับ 15, สถานะ 1, บรรทัด 1 ไวยากรณ์ไม่ถูกต้องใกล้กับ 'Q'"

ถ้าฉันลบ alias ที่เกิดขึ้นทั้งหมด "Q" ออกจาก SQL มันก็ใช้ได้

แต่ฉันต้องใช้นามแฝง


5
ทำไมคุณต้องใช้นามแฝง ดูเหมือนคุณจะไม่ต้องการมัน
Mark Byers

5
ใช่ - จากมุมมองการเขียนโปรแกรมฉันไม่ต้องการมัน แต่ฉันมีไลบรารีเก่า / เก่าที่สร้าง DML SQL ทุกชนิดที่มีชื่อแทนตาราง ไลบรารีมีคลาสจำนวนมากพร้อมตรรกะที่ซับซ้อนชนิดหนึ่ง ตอนนี้การกำจัดชื่อแทนตารางในไลบรารีนั้นทำงานได้มากกว่าการปรับแต่งตรรกะที่มีอยู่เพื่อทำงานให้กับ MSSQL นอกจากนี้เมื่อมีหลายตารางที่เกี่ยวข้องฉันต้องมีนามแฝงของตาราง
javauser71

คำตอบ:


422

ไวยากรณ์สำหรับการใช้นามแฝงในคำสั่งการปรับปรุงบน SQL Server เป็นดังนี้:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

แม้ว่านามแฝงไม่ควรจำเป็นที่นี่


2
ใช่ !!! มันได้ผล. ขอบคุณสำหรับการตอบสนองอย่างรวดเร็ว. คุณรู้หรือไม่ว่าเหตุใดเซิร์ฟเวอร์ MSSQL จึงสนับสนุนไวยากรณ์ที่ไม่เป็นทางการดังกล่าวเพื่ออัปเดต
javauser71

3
Mark Byers - คำตอบที่ยอดเยี่ยม !! รูปแบบนี้จะช่วยให้ฉันเพื่อเพิ่มความเห็นออกคำสั่งเลือกซึ่งจะช่วยให้ฉันเพื่อทดสอบการปรับปรุงโดยการทำเลือกแรก (ไฮไลท์จากเลือกลงและดำเนินการ):SET Q.TITLE = 'TEST' -- SELECT *

2
ดี สิ่งนี้ทำให้ง่ายต่อการใช้ Intellisense ในส่วนคำสั่ง
Magnus

นั่นไม่ใช่นามแฝง นั่นเป็นเพียงชื่อ 'table.column' ที่มีคุณสมบัติครบถ้วน: - /
ScottWelker

18

คุณสามารถใช้แนวทางCTE (Common Tabular Expression) ได้ตลอดเวลา

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';

ใช่ - มันยังใช้งานได้ แต่สำหรับโปรแกรม JDBC / Java นี่เป็นไวยากรณ์ที่ซับซ้อนชนิดหนึ่ง ขอบคุณสำหรับคำตอบของคุณ
javauser71

-1

กรณีพิเศษสำหรับ Postgres

รายการข้างต้นการแก้ปัญหาจะไม่ทำงานสำหรับฉัน ดังนั้นนี่คือทางออกสำหรับ Postgres

ในขณะที่ฉันเป็นไฟแบบสอบถามของฉัน

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

ผลลัพธ์: ข้อผิดพลาด: คอลัมน์ "q" ของความสัมพันธ์ "ตาราง" ไม่มีอยู่

วิธีแก้ปัญหาคือคุณไม่จำเป็นต้องใช้ allis ในค่าข้อมูล SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';

สวัสดี Ronak, downvoting คำตอบของคุณเนื่องจากเป็น Postgres และมีวิธีแก้ปัญหาการทำงานสำหรับ T-SQL ด้านบนอยู่แล้ว
Alpi Murányi

hii @ AlpiMurányiคุณสามารถแนะนำให้ฉันรู้ว่าอะไรคือวิธีแก้ปัญหาการทำงานในกรณีของฉัน เพื่อให้ฉันสามารถใช้งานได้กล่าวถึงข้อผิดพลาดในคำตอบของฉันแล้ว
Ronak Patel
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.