Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ORA-30926 लौटाने वाली क्वेरी मर्ज करें:स्रोत तालिका में पंक्तियों का एक स्थिर सेट प्राप्त करने में असमर्थ

आपके पास शायद डेटा में डुप्लीकेट हैं। DISTINCT यह गारंटी नहीं देता कि आपके पास IdToUpdate है अद्वितीय जब आप इसे अन्य स्तंभों के साथ उपयोग करते हैं। देखें:

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

आपको मिलेगा IdToUpdate दो बार। अपना डेटा जांचें:

'
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;

एग्रीगेशन फ़ंक्शन का उपयोग करने का एक तरीका है(MAX/MIN) 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. JDBC :मेटाडेटा से एक सरणी का प्रकार प्राप्त करें

  2. Oracle डाटाबेस उदाहरण में जावा

  3. ओरेकल एसक्यूएल में सप्ताहांत और छुट्टियों को छोड़कर दिनांक अंतर के लिए कस्टम फ़ंक्शन बनाएं

  4. SQL दिनांकों में पारित 2 के बीच कार्य दिवसों की संख्या वापस करने के लिए

  5. डेटाबेस इंसर्ट मैकेनिज्म