sql >> Databáze >  >> RDS >> Oracle

Slučovací dotaz vrací ORA-30926:nelze získat stabilní sadu řádků ve zdrojových tabulkách

Pravděpodobně máte v datech duplikáty. DISTINCT nezaručuje, že máte IdToUpdate jedinečný, když jej použijete s jinými sloupci. Viz:

CREATE TABLE #MyTable(IdToUpdate INT, LogSetIdToUpdateTo INT);INSERT INTO #MyTable VALUES (1,1), (1,2), (2,1),(3,1);SELECT DISTINCT IdToUpdate , LogSetIdToUpdateToFROM #MyTable; 

LiveDemo

Získáte IdToUpdate dvakrát. Zkontrolujte svá data:

s cte as (Select odlišný nulllogsetid.id jako idToupDate, známý, logsetIdToupDateto z mytable známého známého a známého nulllogsetId na známémLogSetid. DEF' a známéLogSetId.LogSetId>=0 a nullLogSetId.LogSetId =-1)SELECT IdToUpdate, COUNT(*) AS cFROM cteGROUP BY IdToUpdateHAVING COUNT(*)> 1;

Jedním ze způsobů je použít funkci agregace(MAX/MIN) místo DISTINCT :

Sloučte se do mytableusing (vyberte nulllogsetId.id jako idToupdate, max (známýLogSetid.LogSetId) jako logSetIdToupDateto z mytable známého napisovateidIfirTeTeTeTeTeTeTeTeTeTeTeTeTetid.Identifier.Identifier.Identifier.Identifier.Identifier.Identifier.Identifier.Identifier.Identifier. IdentifierType ='DEF' a známéLogSetId.LogSetId>=0 a nullLogSetId.LogSetId =-1 GROUP BY nullLogSetId.Id) v (Id =IdToUpdate) při shodě pakupdate set LogSetId =LogSetI


  1. MySQL - najít rozdíl mezi řádky stejné tabulky

  2. Jak funguje CONCAT_WS() v MariaDB

  3. MySQL konsoliduje duplicitní datové záznamy pomocí UPDATE / DELETE

  4. SQL dotaz pro získání prvního data v závislosti na aktuální skupině (~kontrolní přestávka)