sql >> Database >  >> RDS >> Oracle

Query samenvoegen die ORA-30926 retourneert:kan geen stabiele set rijen in de brontabellen krijgen

U hebt waarschijnlijk dubbele gegevens in de gegevens. DISTINCT garandeert niet dat je IdToUpdate . hebt uniek als je het met andere kolommen gebruikt. Zie:

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

U krijgt IdToUpdate tweemaal. Controleer uw gegevens:

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;

Een manier om te gaan is om de aggregatiefunctie(MAX/MIN) . te gebruiken in plaats van 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. Hoe een MYSQL-tabel op een permanente manier sorteren?

  2. Wat is het maximale aantal rijen dat een enkele SQL Server-tabel kan opslaan?

  3. Waarom werkt mijn databaseback-upscript niet in php?

  4. Hiërarchiegegevens ophalen uit zelfverwijzende tabellen