Anda tidak memiliki UPDATE FROM
sintaks kepemilikan SQL Server turun. Juga tidak yakin mengapa Anda harus bergabung di CommonField
dan juga memfilternya sesudahnya. Coba ini:
UPDATE t1
SET t1.CalculatedColumn = t2.[Calculated Column]
FROM dbo.Table1 AS t1
INNER JOIN dbo.Table2 AS t2
ON t1.CommonField = t2.[Common Field]
WHERE t1.BatchNo = '110';
Jika Anda melakukan sesuatu yang benar-benar konyol - seperti terus-menerus mencoba mengatur nilai satu kolom ke agregat kolom lain (yang melanggar prinsip menghindari penyimpanan data yang berlebihan), Anda dapat menggunakan CTE (ekspresi tabel umum) - lihat di sini dan di sini untuk lebih jelasnya:
;WITH t2 AS
(
SELECT [key], CalculatedColumn = SUM(some_column)
FROM dbo.table2
GROUP BY [key]
)
UPDATE t1
SET t1.CalculatedColumn = t2.CalculatedColumn
FROM dbo.table1 AS t1
INNER JOIN t2
ON t1.[key] = t2.[key];
Alasan ini benar-benar konyol, adalah bahwa Anda harus menjalankan kembali seluruh pembaruan ini setiap kali setiap baris table2
perubahan. A SUM
adalah sesuatu yang selalu dapat Anda hitung saat runtime dan, dengan melakukan itu, tidak perlu khawatir bahwa hasilnya basi.
UPDATE table1 a SET a.[field] = b.[field]
- menghapus alias tidak berfungsi, jadiUPDATE table1 a SET [field] = b.[field]
UPDATE t1 INNER JOIN t2 on t2.col = t1.col SET t1.field=value WHERE t2.col=something
.Coba seperti ini:
sumber
Jawaban yang diberikan di atas oleh Aaron sempurna:
Hanya ingin menambahkan mengapa masalah ini terjadi di SQL Server ketika kami mencoba menggunakan alias dari tabel saat memperbarui tabel itu, di bawah ini disebutkan sintaks akan selalu memberikan kesalahan:
kasing bisa apa saja jika Anda memperbarui satu tabel atau memperbarui saat menggunakan bergabung.
Meskipun permintaan di atas akan berfungsi dengan baik dalam PL / SQL tetapi tidak dalam SQL Server.
Cara yang benar untuk memperbarui tabel saat menggunakan alias tabel di SQL Server adalah:
Semoga ini bisa membantu semua orang mengapa kesalahan datang ke sini.
sumber
sumber
Sepertinya SQL Server 2012 dapat menangani sintaks pembaruan lama dari Teradata juga:
Jika saya ingat dengan benar, 2008R2 memberikan kesalahan ketika saya mencoba permintaan serupa.
sumber
Saya merasa berguna untuk mengubah PEMBARUAN menjadi SELECT untuk mendapatkan baris yang ingin saya perbarui sebagai tes sebelum memperbarui. Jika saya dapat memilih baris yang tepat yang saya inginkan, saya dapat memperbarui hanya baris yang ingin saya perbarui.
sumber
Lebih banyak alternatif di sini .
sumber
Pendekatan lain adalah menggunakan MERGE
-Merge adalah bagian dari Standar SQL
-Juga saya cukup yakin bahwa pembaruan dalam gim tidak bersifat deterministik .. Pertanyaan serupa di sini di mana jawabannya berbicara tentang http://ask.sqlservercentral.com/questions/19089/updating-two-tables-using-single-query. html
sumber
MERGE
.Saya memiliki masalah yang sama .. dan Anda tidak perlu menambahkan kolom fisik .. karena sekarang Anda harus memeliharanya .. yang dapat Anda lakukan adalah menambahkan kolom generik dalam kueri pemilihan:
EX:
sumber
Pendekatan Harun di atas bekerja dengan sempurna untukku. Pernyataan pembaruan saya sedikit berbeda karena saya harus bergabung berdasarkan dua bidang yang disatukan dalam satu tabel untuk mencocokkan bidang di tabel lain.
sumber
Mencoba:
sumber
table1
, bukan hanya baris di mana ada kecocokan pada bidang umum di antara kedua tabel (efektif gabungan kiri dan bukan gabungan internal).BatchNo = '110'
, bukan? Apakah semua downvotes datang sebagai akibat dari efek ini, atau apakah orang lain memiliki alasan lain untuk memilih-down?NULL
, dan formulir ini mungkin merupakan solusi spesifik kurang T-SQL.