2013-05-13 6 views
5

के लिए प्राथमिक कुंजी उल्लंघन में DISTINCT परिणामों का चयन करें मुझे कुछ अन्य समस्याओं से डेटा को थोक में डालने में कुछ समस्याएं थीं।INSERT INTO/SEST_CT

CREATE TABLE TEST_T (
     T_GUID RAW(16) DEFAULT SYS_GUID() NOT NULL, 
     T_VAL1 NUMBER(10) NOT NULL, 
     T_VAL2 VARCHAR2(10) NOT NULL, 
     PRIMARY KEY (T_GUID) 
) 

बयान के सरलीकृत संस्करण मैं डेटा के साथ भरने के लिए इरादा:

INSERT INTO TEST_T (T_VAL1, T_VAL2) 
SELECT DISTINCT 
    CAST(SUBSTR(zip_code, 1,1) AS NUMBER) as t_val1, 
    zip_code as t_val2 
FROM OTHER_TABLE_T 
WHERE ... 
ORDER BY t_val1 

मैं प्रदान नहीं कर रहा हूँ के रूप में एक T_GUID मूल्यवान, मैं मान लिया गया है होगा लक्ष्य इस तरह कुछ हद तक देखा कि मुझे प्रत्येक नई लाइन के लिए SYS_GUID फ़ंक्शन द्वारा प्रदान किया गया एक मिलता है। लेकिन कुछ गलत हो रहा है, और मुझे प्राथमिक कुंजी के लिए एक विशिष्टता बाधा उल्लंघन मिलता है।

यदि मैं DISTINCT हटा देता हूं, तो कथन सफल होता है, लेकिन मुझे बहुत सारी डुप्लिकेट प्रविष्टियां मिलती हैं। और, ज़ाहिर है, अगर मैं स्पष्ट रूप से SYS_GUID() को अपने SELECT में कॉल करता हूं, तो इसका बिल्कुल वही परिणाम होता है।

अब मैंने पाया कि अगर मैं बस मेरा चारों ओर एक और SELECT शब्दों में कहें, यह ठीक से काम करता है, कोई बाधा के उल्लंघन और अलग पंक्तियों डाला हो:

INSERT INTO ... 
SELECT x.* FROM (
    SELECT DISTINCT ... 
) x 

तो जहां डुप्लिकेट GUIDs से आते हैं? यदि पंक्तियों के पूर्ण सेट में कोई समस्या नहीं है, तो अलग कारणों के कारण पंक्तियों को क्यों हटाया जाएगा? चूंकि SYS_GUID प्रत्येक कॉल के लिए एक अद्वितीय पहचानकर्ता बनाता है, मैं केवल कल्पना कर सकता हूं कि अलग-अलग मामले में इसे केवल पूरे खंड के लिए बुलाया जाता है, जिसे आस-पास के रैपिंग SELECT द्वारा हल किया जाता है। अगर कोई समझ सकता है कि उस मामले में निष्पादन कैसे भिन्न होता है तो मैं बहुत खुश हूं।

+0

क्या आप वाकई guids डुप्लिकेट हैं कर रहे हैं? उन पर बहुत बारीकी से देखो, वे समान दिखते हैं लेकिन आपको उनमें से प्रत्येक में कम से कम एक चरित्र को ध्यान में रखना चाहिए। – GriffeyDog

+0

आपका कोड सही दिखता है। आप ओरेकल बग को मार रहे हैं, देखो "एईक्स पर उत्पन्न डिप्लीकेट SYS_GUID मेरे ओरेकल सपोर्ट पर एनक्यू [आईडी 1371805.1]" के दौरान ओआरए -1 त्रुटियों का कारण बन सकता है। –

उत्तर

0

CAST को to_number() से बदलें और guid जोड़ें। टेस्ट अपने चुनिंदा पहले, फिर डालने ...:

SELECT DISTINCT 
    sys_guid() guid 
    To_Number(SUBSTR(zip_code, 1,1)) as t_val1, 
    zip_code as t_val2 
FROM OTHER_TABLE_T 
/

अलग GUID उदाहरण:

SELECT sys_guid() gid, deptno 
    FROM 
(
SELECT distinct deptno FROM scott.emp 
) 
ORDER BY deptno 
/

GID         DEPTNO 
------------------------------------------- 
DC9B9132492C1A45E04011AC3EEB463A 10 
DC9B9132492B1A45E04011AC3EEB463A 20 
DC9B9132492A1A45E04011AC3EEB463A 30 
+0

'to_number' सुझाव के लिए धन्यवाद, लेकिन यह वास्तव में मेरी मुख्य समस्या को हल नहीं करता है। यदि मैं चयन में sys_guid पेश करता हूं, तो विशिष्ट किसी भी डुप्लिकेट लाइनों को फ़िल्टर नहीं करेगा (उदाहरण के लिए यदि मेरे पास एक ही ज़िपिपोड के साथ कई पंक्तियां हैं, लेकिन एक अलग अन्य कॉलम)। – mhd

+0

@ एमएचडी - फिर अलग-अलग समूह से छुटकारा पाएं या ऑपरेटर आदि मौजूद है ... कुछ प्रकार के अनुक्रम के बजाय गाइड का उपयोग क्यों करें ... – Art

+0

काम पर यहां डिज़ाइन विकल्प, अधिकांश तालिकाओं में आईडी पीके के रूप में GUID हैं। और हां, कई कामकाज संभव हैं, और मैंने अपनी समस्या को सरल लपेटने के साथ हल कर लिया है। लेकिन यह पुराना "डॉक्टर जैसा है, जब मैं ऐसा करता हूं तो मेरी बांह दर्द होती है"/"फिर यह मत करो" मजाक। अपनी व्यक्तिगत शिक्षा के लिए, मैं जानना चाहता हूं कि मूल के साथ क्या गलत है, भले ही रिलेशनल मॉडल की मेरी अवधारणा सिर्फ खराब है या यह सिर्फ एक बग है। – mhd

1

कुछ इस तरह का प्रयास करें:

insert into test_t(t_guid, t_val1, t_val2) 
    select sys_guid(), t_val1, t_val2 
    from (select distinct to_number(substr(zip_code, 1, 1)) as t_val1, zip_code as t_val2 
      from other_table_t 
      where ...) 
+0

मुझे ऐसा करने की भी आवश्यकता नहीं है। जैसा कि मैंने उपरोक्त लिखा है, जैसे ही मैं 'चयन करें * से चुनें (विशिष्ट चुनें ...', यह काम करता है।मेरे पास अभी कोई अच्छा स्पष्टीकरण क्यों नहीं है। – mhd

संबंधित मुद्दे