Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Kwerenda scalająca zwracająca ORA-30926:nie można uzyskać stabilnego zestawu wierszy w tabelach źródłowych

Prawdopodobnie masz duplikaty danych. DISTINCT nie gwarantuje, że masz IdToUpdate unikalny, gdy używasz go z innymi kolumnami. Zobacz:

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

Otrzymasz IdToUpdate dwa razy. Sprawdź swoje dane:

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;

Jednym ze sposobów jest użycie funkcji agregacji(MAX/MIN) zamiast 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. Jak powiedzieć oracle, aby sortowała według określonej kolejności sortowania przekazanej z javy?

  2. Jak usunąć duplikaty z listygg

  3. Błąd podczas wstawiania danych zawierających pojedyncze cudzysłowy

  4. Jak usunąć przyczynę wystąpienia wyjątku Hibernate IllegalArgumentException podczas wywoływania setter?

  5. Opcjonalne jednostki bazy danych