2009-07-03 10 views
5

2 टेबलबहु-भाग पहचानकर्ता 2008

requests (ID, company_id, amount)

companies (ID, name)

FK बाधा के साथ

है (SQL सर्वर पर बाध्य नहीं किया जा सकता है requests.company_id ->companies.id)

requests.companyहो सकता है

मुझे सभी अनुरोध प्राप्त करने और company_id को विनियमित कंपनी name के साथ प्रतिस्थापित करने की आवश्यकता है या अगर कोई कंपनी निर्दिष्ट नहीं की गई है तो इसे खाली छोड़ दें।

मैं अगले प्रश्न हैं:

SELECT R.[ID], C.[name] AS [company], R.[amount], ... 
FROM [requests] AS R, [companies] AS C, ... 
WHERE R.[company_id] = C.[ID] 

और यह company क्षेत्र में एक शून्य तक ठीक काम कर रहा है।

मैं आगे क्या करने की कोशिश की:

SELECT R.[ID], C.[name] AS [company], ... 
FROM [requests] AS R, ... 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 

लेकिन

बहु-भाग पहचानकर्ता "R.company_id"

बाध्य नहीं किया जा सकता है मिल गया और एक ही त्रुटियों पर ON क्लॉज स्थानांतरण में फ़ील्ड। मैं क्या गलत कर रहा हूं?

उत्तर

9

कोड उदाहरण आप से पता चला है दीर्घवृत्त था और मेरा मानना ​​है कि यह क्या दीर्घवृत्त कि मुसीबत खड़ी कर रहे हैं में है।

आपके पास:

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [requests] AS R, [eXample] as X 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 
WHERE X.[request_id] = R.ID 

दूसरे शब्दों में पूर्व एएनएसआई 92 भीतरी बाहरी एएनएसआई 92 के साथ वाक्य रचना में शामिल होने के वाक्य रचना में शामिल होने का मिश्रण:

SELECT R.[ID], C.[name] AS [company], ... 
FROM [requests] AS R, ... 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 

चलो कहते हैं कि ऐसा ही कुछ है करते हैं। एसक्यूएल सर्वर 2005 पर परीक्षण, ऐसा प्रतीत होता है कि अनुरोधों के लिए उपनाम आर को अल्पविराम से पहले नहीं देखा जाता है जो आर को आपके उदाहरण में और [eXample] को एक्स में अलग करता है।निम्नलिखित तथापि किया काम:

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [eXample] as X, [requests] AS R 
-- Requests and companies on the same side of the comma 
LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = S.ID 
WHERE X.[request_id] = R.ID 

या

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [requests] AS R LEFT OUTER JOIN [companies] AS C 
    ON R.[company_id] = S.ID, [eXample] as X 
WHERE X.[request_id] = R.ID 
-- Yuck, I would hate to find this. Not at all sure from reading 
-- the code how it would work. 

या मेरी पसंदीदा है, क्योंकि मैं एएनएसआई तरह 92 में शामिल होने के वाक्य रचना:

SELECT R.[ID], C.[name] AS [company], X.Field 
FROM [requests] AS R 
INNER JOIN [eXample] as X ON X.[request_id] = R.ID 
LEFT OUTER JOIN [companies] AS C ON R.[company_id] = S.ID 
+2

तालिका "एस" के रूप में उपनाम कहां है ताकि बाधा "= एसआईडी" काम करे? –

+1

एसआईडी ओपी में था, शायद इलिप्स के भीतर कुछ। ??? चूंकि उसने ओपी की मदद की, इसलिए मैं संपादित नहीं करना चाहता, क्योंकि मुझे डर है कि मैं सिर्फ स्पष्टीकरण को कुचल दूंगा। गायब कोड के साथ यह कड़ी मेहनत कर रहा था। –

3

मुझे लगता है कि आप चाहते हैं:

SELECT R.[ID], ISNULL(C.[name], '') AS [company] 
FROM [requests] AS R 
    LEFT OUTER JOIN [companies] AS C 
ON R.[company_id] = C.ID 

संपादित करें: टिप्पणियाँ देखें, बाएं शामिल होने की जरूरत है ...

यह भी मुझे ऐसा लगता है बाईं के लिए कोई आवश्यकता नहीं है कि में शामिल होने, तो आप कर सकते हैं के रूप में पुनर्लेखन:

SELECT R.[ID], C.[name] AS [company] 
FROM [requests] AS R 
    JOIN [companies] AS C 
ON R.[company_id] = C.ID 
+0

उसे बाएं शामिल होने की आवश्यकता है। अनुरोध। कॉम्पैनी_आईडी शून्य हो सकता है। बाहरी शामिल होने के बिना, अनुरोध है कि कंपनी_आईडी शून्य है, परिणाम से हटा दिया जाएगा। –

+0

@ शैनन, आप सही हैं, मुझे यह याद आया: या अगर कोई कंपनी निर्दिष्ट नहीं की गई तो इसे खाली छोड़ दिया। –

1

अल्पविराम में तालिका क्रम बदलने उस में काम करता है एसक्यूएल सर्वर 2005,2008 और 2012

उदाहरण

SELECT t1.*,t2.*, t3.* 
FROM table1 AS t1, table2 as t2 
LEFT OUTER JOIN table3 AS t3 
ON t1.id = t3.id 
WHERE t1.id = t2.id 

क्वेरी ऊपर एसक्यूएल 2005 में काम करते हैं और अगर आप क्वेरी को फिर से लिखने और अल्पविराम के में तालिका का क्रम बदल:

मान लीजिए कि आप जो नीचे की तरह एक प्रश्न है एसक्यूएल 2005 और इसके बाद के संस्करण में असफल हो जायेगी चलो शामिल होने से पहले। उदाहरण

SELECT t1.*,t2.*, t3.* 
FROM table2 as t2, table1 as t1 
LEFT OUTER JOIN table3 AS t3 
ON t1.id = t3.id 
WHERE t1.id = t2.id 
संबंधित मुद्दे