Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Gabungkan kueri yang mengembalikan ORA-30926:tidak bisa mendapatkan set baris yang stabil di tabel sumber

Anda mungkin memiliki duplikat dalam data. DISTINCT tidak menjamin Anda memiliki IdToUpdate unik saat Anda menggunakannya dengan kolom lain. Lihat:

CREATE TABLE #MyTable(IdToUpdate INT, LogSetIdToUpdateTo INT);

INSERT INTO #MyTable VALUES (1,1), (1,2), (2,1),(3,1);

SELECT DISTINCT IdToUpdate, LogSetIdToUpdateTo
FROM #MyTable;

LiveDemo

Anda akan mendapatkan IdToUpdate dua kali. Periksa data Anda:

with cte AS (
  select distinct nullLogSetId.Id as IdToUpdate,
                  knownLogSetId.LogSetId LogSetIdToUpdateTo
  from MyTable knownLogSetId 
  join MyTable nullLogSetId
    on knownLogSetId.IdentifierType = nullLogSetId.IdentifierType 
   and knownLogSetId.Identifier = nullLogSetId.Identifier 
  where 
    knownLogSetId.IdentifierType = 'DEF'
    and knownLogSetId.LogSetId >= 0 
    and nullLogSetId.LogSetId = -1
)
SELECT IdToUpdate, COUNT(*) AS c
FROM cte
GROUP BY IdToUpdate
HAVING COUNT(*) > 1;

Salah satu caranya adalah dengan menggunakan fungsi agregasi(MAX/MIN) bukannya DISTINCT :

merge into MyTable
using
(

  select nullLogSetId.Id as IdToUpdate,
         MAX(knownLogSetId.LogSetId) AS LogSetIdToUpdateTo 
  from MyTable knownLogSetId 
  join MyTable nullLogSetId
    on knownLogSetId.IdentifierType = nullLogSetId.IdentifierType 
   and knownLogSetId.Identifier = nullLogSetId.Identifier 
  where 
    knownLogSetId.IdentifierType = 'DEF'
    and knownLogSetId.LogSetId >= 0 
    and nullLogSetId.LogSetId = -1
  GROUP BY nullLogSetId.Id
) on (Id = IdToUpdate)
when matched then
update set LogSetId = LogSetIdToUpdateTo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa quantifier yang tidak serakah terkadang berfungsi di Oracle regex?

  2. Kebuntuan di Oracle

  3. Arahkan ADO.Net DataSet ke database yang berbeda saat runtime?

  4. Konversi stempel waktu di Oracle untuk format YYYY-MM-DD HH:MM:SS

  5. Kesalahan 1033 diterima masuk ke standby