2012-04-04 14 views
12

पर SQL सर्वर तालिकाओं में शामिल हों मुझे उम्मीद है कि यह दोहराना नहीं है। मैंने खोजों की जांच की है और मुझे इसका स्पष्ट उत्तर नहीं मिल रहा है।एक समान कथन

मेरे पास एक सारणी है जिसमें इसका प्राथमिक कुंजी सेट UniqueIdentifier है। मेरे पास एक और टेबल भी है जिसमें varchar कॉलम है जिसमें मूल रूप से एक क्वेरी स्ट्रिंग वाला यूआरएल होता है जिसमें मेरी पहली तालिका से guids शामिल होते हैं।

तो मेरी 2 तालिकाओं की तरह कर रहे हैं:

StateTable

StateID         StateName 
EB06F84C-15B9-4397-98AD-4A63DA2A238E  Active 

URLTable

URL 
page.aspx?id=EB06F84C-15B9-4397-98AD-4A63DA2A238E 

मुझे क्या करना कोशिश कर रहा हूँ एक साथ शामिल URLTable और StateTable चालू है StateID का मूल्य निहित है यूआरएल टेबल के यूआरएल में। मैंने वास्तव में शामिल होने का अनुमान नहीं लगाया है। मैंने बस एक टेबल का चयन करने का प्रयास किया है और StateTable में मानों द्वारा फ़िल्टर करने का प्रयास किया है। यहां तक ​​कि वह काम नहीं करता, क्योंकि यह कहता है कि मैं uniqueidentifier और varchar तुलना कर रहा हूं

SELECT * 
FROM URLTable 
WHERE  EXISTS 
    (SELECT * 
    FROM StateTable 
    WHERE URL LIKE '%' + StateID + '%') 

: मैं कुछ इस तरह कर रही कोशिश की है।

क्या एक समान कमांड का उपयोग करके 2 टेबल में शामिल होने का कोई तरीका है और जहां कमांड 2 असंगत चर की तुलना नहीं कर रहा है?

धन्यवाद !!

अद्यतन: मुझे कुछ अतिरिक्त चीजें जोड़ने दें जो मुझे बताई जानी चाहिए। क्वेरी एनालिटिक्स रिपोर्ट बनाने के प्रयोजनों के लिए है। टेबल एक सीएमएस विश्लेषिकी पैकेज का हिस्सा हैं ... इसलिए तालिका संरचना को अद्यतन या बदलना एक विकल्प नहीं है।

दूसरा, इन तालिकाओं में साइट एनालिटिक्स को कैप्चर करने के बाद से बहुत अधिक ट्रैफ़िक दिखाई देता है ... इसलिए प्रदर्शन बहुत अधिक समस्या है। तीसरी बात यह है कि मेरे उदाहरण में, मैंने आईडी कहा = लेकिन id=guid&user=guid&date=date जैसे कई मान हो सकते हैं।

अद्यतन 2: एक और चीज जिसे मैंने अभी अपने डरावनी महसूस किया है, कभी-कभी क्वेरी स्ट्रिंग में GUID से हटाए गए डैश होते हैं .. और कभी-कभी नहीं .. इसलिए जब तक मैं गलत नहीं होता, मैं सबस्ट्रिंग नहीं डाल सकता Uniqueidentifier है। किसी को भी इस बात की पुष्टि कर सकते हैं? आह। मैं इसे

REPLACE('-','',CONVERT(varchar(50), a.AutomationStateId)) 

का उपयोग कर काम करने के लिए मिला है, लेकिन अब मैं इस के बाद से यूआरएल तालिका बहुत बड़ी है। यह हो सकता है के साथ बहुत ज्यादा प्रदर्शन के मुद्दों के बारे में चिंतित हूँ जानवर की प्रकृति, हालांकि, जब तक मैं कुछ भी नहीं कर सकता।

उत्तर

17

एक COMP को राज्य आईडीआईडी ​​कास्ट करें अयोग्य प्रकार, उदा।

WHERE URL LIKE '%' + CONVERT(varchar(50), StateID) + '%' 

या

WHERE URL LIKE N'%' + CONVERT(nvarchar(50), StateID) + N'%' 

यदि URL nvarchar (...)

संपादित

के रूप में एक और उत्तर में बताया, इस बड़े टेबल पर खराब प्रदर्शन हो सकता है। एक कनवर्टर के साथ संयुक्त LIKE परिणाम तालिका स्कैन होगा। यह छोटी तालिकाओं के लिए कोई समस्या नहीं हो सकती है, लेकिन यदि आपको कोई समस्या हो तो आपको URL को दो स्तंभों में विभाजित करने पर विचार करना चाहिए। एक कॉलम में 'page.aspx? Id =' और दूसरा अनन्य होता है। तब आपकी क्वेरी को अधिक आसानी से अनुकूलित किया जा सकता था।

5

क्या आप जानते हैं कि = हमेशा वहां रहता है और हमेशा UNIQUEIDENTIFIER होता है। तो फिर तुम यह कर सकते हैं: टिप्पणी के हिस्से के रूप

WHERE CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID 

संपादित

आप भी कर सकते हैं यह एक JOIN के साथ ऐसा। इस तरह:

select 
    u.* 
from 
    urltable 
join statetable s 
    on CAST(SUBSTRING(URL, CHARINDEX('=',URL)+1,LEN(URL)) AS UNIQUEIDENTIFIER)=StateID 
+0

+1 और मुझे लगता है कि आप उस वाक्यविन्यास का उपयोग – Paparazzi

+0

में शामिल कर सकते हैं – Arion

+0

उत्तर अपडेट किया गया होगा यदि यह जानकर कि मैं कुछ जानना चाहता हूं मैं हमेशा खोज रहा हूं "आईडी =" स्ट्रिंग का पालन करेगा और यह हमेशा निम्नलिखित 36 वर्ण होंगे? शायद सीएएसटी (सबस्ट्रिंग (यूआरएल, CHARINDEX ('आईडी =', यूआरएल) +1,36 के रूप में कुछ) जैसा कि UNIQUEIDENTIFIER) = स्टेटआईडी और उस पर प्रदर्शन कैसा है? – divamatrix

4
select u.* from urltable 
join statetable s on url like N'%' + (convert(varchar(50),s.stateid) + N'%' 

प्रदर्शन भयंकर

+0

अतिरिक्त तालिका पर सुझाव के लिए धन्यवाद। असल में, मुझे लगता है कि यह एक अच्छा विचार है और निश्चित रूप से मौजूदा संरचना में हस्तक्षेप किए बिना काम करेगा। अब .. मैं ईमानदार रहूंगा और कहूंगा कि मैं डीबीए नहीं हूं। उस टेबल को बनाने और बनाए रखने के बारे में जाने का सबसे अच्छा तरीका कोई सलाह? यह जानकर कि डेटाबेस अक्सर अपने स्वयं के डीबी सर्वर पर होस्ट किया जाता है, मैं शायद एनालिटिक्स डीबी की बजाय वेबसाइट डीबी में एक टेबल जोड़ने पर विचार करता हूं। – divamatrix

+0

बेहतर अगर teh नई तालिका एक ही डीबी में है या कम से कम एक ही सर्वर में है, तो थोड़ा और काम नहीं है। तालिका के लिए बड़ा सवाल स्कीमा है क्या आप एक ही गाइड के लिए एक से अधिक यूआरएल रिकॉर्ड प्राप्त कर सकते हैं। –

+0

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

0

अगर आप सूचकांक करने के लिए विकल्प अस्थायी तालिका के साथ पहली बार एक अस्थायी तालिका का निर्माण, आप एक प्रदर्शन में सुधार प्राप्त कर सकते हैं होने की संभावना है। फिर आप स्कीमा (अपनी अस्थायी तालिका के) को भी संशोधित कर सकते हैं जो आपको आपके शामिल होने पर विकल्प दे सकता है। अक्सर जब बड़ी टेबल में शामिल होता है तो यह पहले डेटा के एक सबसेट को एक अस्थायी तालिका में निकालने में मदद करता है, फिर इसमें शामिल हो जाता है। अन्य समय अस्थायी रूप से 'बदसूरत' का उपयोग करने से बड़ा होता है

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