Pertanyaan Dapatkah Anda menggunakan nilai agregat dalam KUNCI DUPLICATE ON


Saya mencoba menulis pertanyaan serupa dengan:

INSERT INTO SomeTable(field1, field2) 
SELECT 'blah' AS field1, 
        MAX(AnotherTable.number) AS field2
FROM AnotherTable
ON DUPLICATE KEY 
UPDATE field1= 'blah', field2 = MAX(AnotherTable.number)

Saya mendapatkan Kode Kesalahan: 1111 Penggunaan fungsi grup tidak valid.

Membaca dokumentasi MySql:

http://dev.mysql.com/doc/refman/5.1/en/insert-select.html

baris yang menarik adalah:

"Di bagian nilai dari ON DUPLICATE KEY UPDATE, Anda dapat merujuk ke kolom di tabel lain, selama Anda tidak menggunakan GROUP BY di bagian SELECT. Salah satu efek sampingnya adalah Anda harus memenuhi syarat nama kolom yang tidak unik di bagian nilai. "

Apakah ini masalah yang saya lihat? Saya tidak secara khusus melakukan GROUP BY dalam pernyataan Pilih, tetapi dengan menggunakan fungsi agregat (Max), maka saya mungkin mengelompokkan secara implisit.

Jika ada yang tahu pasti apakah saya secara implisit melakukan GROUP BY atau jika ada cara lain saya bisa mendapatkan hasil yang diinginkan saya akan sangat berterima kasih.


4
2017-07-24 15:02


asal


Jawaban:


Saya tahu saya menjawab pertanyaan saya sendiri di sini tapi ...

Ini akhirnya berhasil (terima kasih kepada: http://www.getrouty.com/mysql-insert-select-on-duplicate-update-using-aggregate-functions/)

INSERT INTO SomeTable(field1, field2) 
SELECT 'blah' AS field1, 
    MAX(AnotherTable.number) AS field2
FROM AnotherTable
ON DUPLICATE KEY 
UPDATE field2 = values(field2)

7
2017-07-24 15:24



Silakan mencoba jika ini berfungsi:

INSERT INTO SomeTable(field1, field2) 
SELECT * FROM (
SELECT * FROM (
SELECT 'blah' AS field1, 
        MAX(AnotherTable.number) AS field2
FROM AnotherTable
) sq
) sq2
ON DUPLICATE KEY 
UPDATE field1= 'blah', field2 = sq2.field2

Tidak yakin apakah 2 kali subquery diperlukan. Saya biasanya menggunakan ini untuk menghindari keterbatasan MySQL untuk tidak dapat memperbarui tabel dengan nilai yang saya baca dari tabel yang sama. Tidak yakin apakah ini berfungsi di sini juga.


1
2017-07-24 15:09