2012-04-03 10 views
33

में मुख्य क्वेरी से कॉलम का उपयोग करें क्या वास्तविक समय में कॉलम प्राप्त करने का कोई तरीका है, मुख्य प्रश्न से, और इसे सबक्वायरी में उपयोग करें?एसक्यूएल सर्वर - सबक्वायरी

कुछ इस तरह:

मैं इस मौजूदा क्वेरी को संशोधित करने की जरूरत है: (प्रयोग A.item सबक्वेरी में)

SELECT item1, * 
FROM TableA A 
INNER JOIN 
(
    select * 
    from TableB B 
    where A.item = B.item 
) on A.x = B.x; 

ठीक है, यहाँ असली बात है। यह पहले काम करता था, लेकिन अब डेटाबेस बदल गया है, मुझे कुछ संशोधन करने की जरूरत है, कुछ तुलना जोड़ें। जैसा कि आप देख सकते हैं कि बहुत सारे जॉइन हैं, और उनमें से एक सबक्वायरी है।

Select T0.UnionAll_Empresa,<STUFF> 

from [UNION_ALL_BASES]..OINV T0 with (nolock) 
inner join [UNION_ALL_BASES]..INV6 T1 with (nolock) on t0.DocEntry = t1.DocEntry and t0.UnionAll_Empresa = t1.UnionAll_Empresa 
inner join 

(
select 
t1.CompanyID, 
T2.CompanyDb, 
t1.OurNumber, 
T6.BankCode, 
T6.BankName, 
T3.[Description] Situation, 
T1.[Status], 
T5.Descrption nomeStatus, 
T1.Origin, 
T1.DocEntry, 
T1.DocType, 
T1.ControlKey, 
T1.CardCode, 
T4.[Description] ContractBank, 
T1.PayMethodCode, 
T1.DueDate, 
T1.DocDate, 
T1.InstallmentID, 
T1.InstallmentValue, 
T1.Correction, 
T1.InterestContractural, 
T1.FineContract, 
T1.ValueAbatment, 
T1.ValueDiscount, 
T1.ValueFineLate, 
T1.ValueInterestDaysOfLate, 
T1.OtherIncreases, 
T1.ValueInWords, 
T1.ValueDocument, 
T1.DigitalLine, 
T1.Document 
from [IntegrationBank]..BillOfExchange T1 with (nolock) 
    inner join [InterCompany2]..CompanyHierarchy T2 with (nolock) on T1.CompanyID = T2.ID 
    left join [IntegrationBank]..BillOfExchangeSituation T3 with (nolock) on T1.Situation = T3.ID 
    inner join [IntegrationBank]..ContractBank T4 with (nolock) on T1.ContractBank = T4.ID 
    inner join [IntegrationBank]..BoeStatus T5 with (nolock) on T1.[Status] = T5.ID 
    inner join [UNION_ALL_BASES]..ODSC T6 with (nolock) on T4.BankKey = T6.AbsEntry and **T6.UnionAll_Empresa = T0.UnionALl_Empresa** --I need to do this 
where T1.[Status] <> 5 
and T2.CompanyDb = **T0.UnionAll_Empresa** --I need to do this 
) TBI on (T1.DocEntry = TBI.DocEntry and T1.InstlmntID = TBI.InstallmentID and TBI.DocType = T1.ObjType) 
inner join [UNION_ALL_BASES]..OCTG T2 on T0.GroupNum = T2.GroupNum and T0.UnionAll_Empresa = T2.UnionAll_Empresa 
inner join [UNION_ALL_BASES]..OSLP T3 on T0.SlpCode = T3.SlpCode and T0.UnionAll_Empresa = T3.UnionAll_Empresa 
where not exists (select 1 
     from [UNION_ALL_BASES]..RIN1 A with (nolock) 
       inner join [UNION_ALL_BASES]..ORIN B with (nolock) on A.DocEntry = B.DocEntry and A.UnionAll_Empresa = B.UnionAll_Empresa 
     where A.BaseEntry = T0.DocEntry 
     and B.SeqCode = ''1'') 
+1

क्या आप निर्दिष्ट कर सकते हैं कि "वास्तविक समय में फ़ील्ड प्राप्त करें" से आपका क्या मतलब है? रियल टाइम? इसका क्या मतलब है? – ControlAltDel

+1

आप ऐसा नहीं कर सकते क्योंकि यह एक सबक्वायरी नहीं है। यह व्युत्पन्न तालिका है। आपके डेटाबेस के आधार पर आप ऐसा करने में सक्षम हो सकते हैं। इस उद्देश्य के लिए एमएस एसक्यूएल सर्वर 'पार लागू/बाहरी आवेदन' है। अधिक महत्वपूर्ण बात, आपको इसकी आवश्यकता क्यों है? उपयुक्त क्यों शामिल नहीं है? –

+0

मैंने आपके वास्तविक कोड के लिए अपना उत्तर अपडेट किया। आप बस अपनी 'जॉइन' में एक और शर्त जोड़ सकते हैं और किया जा सकता है। – JNK

उत्तर

19

आपको लगता है कि के लिए एक सबक्वेरी की जरूरत नहीं है:

: मैं एक तुलना एक स्तंभ से ( T6.UnionAll_Empresa = T0.UnionALl_Empresa इस तरह) सबक्वेरी करने के लिए मुख्य क्वेरी से (उदाहरण के लिए तालिका T0 से) जोड़ने की जरूरत
SELECT item1, * 
FROM TableA A 
INNER JOIN 
    TableB B 
    ON A.item = B.item 
    AND A.x = B.x; 

मैं ऐसे परिदृश्य के बारे में नहीं सोच सकता जहां आपको JOIN पर एक फ़िल्टर के साथ एक सबक्वायरी पर आवश्यकता होगी, जहां यह बाहरी क्वेरी में सीधे क्षेत्र के संदर्भ के बराबर नहीं होगा।

आप WHERE खंड में सबक्वेरी में बाहरी तालिका को देख सकते हैं, हालांकि:

SELECT <stuff> 
FROM Table t 
WHERE EXISTS (SELECT 1 from TableB B 
       WHERE t.id = b.id) 

संपादित

अपने वास्तविक कोड के लिए, बस यह करने के लिए JOIN मापदंड बदलने के लिए:

) TBI on (T1.DocEntry = TBI.DocEntry 
      and T1.InstlmntID = TBI.InstallmentID 
      and TBI.DocType = T1.ObjType 
      AND TBI.CompanyDB = T0.UnionAll_Empresa) 
+1

अच्छा, यह सिर्फ एक उदाहरण था। वास्तविक क्वेरी थोड़ा जटिल है, और मैं वास्तव में एक जैसा दृष्टिकोण चाहता हूं जैसा कि मैंने कहा था, भले ही मुझे किसी प्रकार का ग्लोबल वैरिएबल या जो भी =/ –

+0

@ JoãoGuilherme का उपयोग करना पड़े, मुझे लगता है कि यह एक सरलीकरण था। आपको इसके लिए वास्तव में क्या चाहिए? इस तरह के परिदृश्यों के लिए 'जॉइन' स्थितियां मौजूद हैं। – JNK

+0

आप उप क्वेरी नामकरण का प्रयास कर सकते हैं अर्थात् * से चुनें, (जहां से * a.x = y से चुनें) b ... जहां आप चाहते हैं कि आप ऐसा करने में सक्षम होना चाहिए। यदि आप 3 से अधिक हो सकते हैं तो यह समस्या हो सकती है कि आप कितने गहरे घोंसले कर सकते हैं। नेट पर देखकर यह सिंटैक्स द्वारा किया जा सकता है - (एएक्स = बीएक्स) – Alex

-1

आप WITH

का भी उपयोग कर सकते हैं

http://msdn.microsoft.com/en-us/library/ms175972.aspx

+3

हालांकि, वास्तव में सवाल का जवाब नहीं देता है। इसे हल करने के लिए आप सीटीई का उपयोग कैसे करेंगे? – JNK

10

आप एक सबक्वेरी करने पर शामिल होने और "वास्तविक समय में एक स्तंभ प्राप्त"/मुख्य क्वेरी से कोई स्तंभ का संदर्भ लेना चाहते हैं, तो ऐसा करने के लिए एक चाल है। तक पहुँचने के लिए एक होगा

... 
INNER JOIN 
(
    select * 
    from TableB B 
    where A.item = B.item 
) on A.x = B.x; 

रास्ता:

आप टेबल जो सबक्वेरी अगर यह दूसरे शब्दों में, एक aliased तालिका के रूप में प्रयोग किया जाता है के बाहर हैं उपयोग नहीं कर सकते, इस एसक्यूएल एक का उपयोग नहीं कर सकते हैं इस तरह:

SELECT item1, * 
FROM TableA A 
INNER JOIN TableB on TableB.item = TableA.item and TableB.item in 
(
    select top 1 B.Item 
    from TableB B 
    where A.item = B.item 
) 

बस "शीर्ष 1" टुकड़ा उपेक्षा, मैं सिर्फ वहाँ इस तरह शामिल होने के एक करने के लिए एक कारण हो सकता है कि पता चलता है कि जोड़ा।
तो, मूल रूप से यदि आप सबक्वायरी में क्वेरी से किसी आइटम का संदर्भ देना चाहते हैं, तो बस उपरोक्त को शामिल होने के ON अनुभाग पर ले जाएं और उपरोक्त सचित्र के रूप में IN कीवर्ड का उपयोग करें।

+0

यही मुझे चाहिए। – James

+0

मुझे मेरी समस्या – AdRock

31

आप उपयोगकर्ता बाहरी आवेदन कर सकते हैं

SELECT * 
    FROM tbl1 
      OUTER APPLY (SELECT TOP 1 
            currency_id, 
            SUM(taxrate) AS taxrate 
          FROM  tbl2 
          WHERE  wuptr.currency_id = tbl1.currency_id 
          GROUP BY tbl2.currencyid 
         ) 
+0

यह वास्तव में सही जवाब है कि ऐसे मामलों में जहां सबक्वेरी दृष्टिकोण या नहीं किया जा सकता अव्यावहारिक है के लिए काम करता है के साथ मदद की। –

9

आप ऐसा कर सकते हैं मुख्य क्वेरी और नेस्टेड क्वेरी की टेबल नामकरण से। उदाहरण के लिए:

SELECT continent, name, population FROM world x 
    WHERE population >= ALL 
    (SELECT population FROM world y 
     WHERE y.continent=x.continent 
      AND population>0) 

संदर्भ: http://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial

+1

'सभी' कीवर्ड https: // msdn पर संदर्भ।microsoft.com/en-us/library/ms178543.aspx?f=255&MSPPError=-2147217396 – PedroC88

1
नहीं

यकीन है कि क्यों लोग इस अति-उलझी रहे हैं। @ जेएनके सही है कि आप भविष्यवाणी को मुख्य क्वेरी में ले जा सकते हैं। पूर्णता के लिए, मैं प्रदर्शित करूंगा। - इन दोनों "हार्ड" फिल्टर कर रहे हैं, और होगा

T6.UnionAll_Empresa = T0.UnionAll_Empresa 
T2.CompanyDb = T0.UnionAll_Empresa 

पहली तालिका T6 पर एक INNER JOIN विधेय है, और दूसरा एक WHERE खंड:

आप अपने सबक्वेरी में दो विधेय संदर्भ T0 है उन परिणामों को फ़िल्टर करें जो मेल नहीं खाते हैं (LEFT OUTER JOIN के विपरीत जो केवल उस तालिका के मानों को NULL पर संदर्भित करेगा)। तब

T2.CompanyDb = T6.UnionAll_Empresa 

, हम सबक्वेरी में WHERE खंड हटा सकते हैं और:

खैर, T6.UnionAll_Empresa और T2.CompanyDb के बाद से दोनों T0.UnionAll_Empresa के खिलाफ फिल्टर करने के लिए की जरूरत है, तो हम बस INNER JOIN विधेय T6 पर यह करने के लिए बदल सकते हैं हम मुख्य क्वेरी में TBI को यह JOIN विधेय जोड़ सकते हैं:

TBI.CompanyDb = T0.UnionAll_Empresa 

... संपूर्ण क्वेरी थी बनाने रों:

Select T0.UnionAll_Empresa,<STUFF> 

from [UNION_ALL_BASES]..OINV T0 with (nolock) 
inner join [UNION_ALL_BASES]..INV6 T1 with (nolock) on t0.DocEntry = t1.DocEntry and t0.UnionAll_Empresa = t1.UnionAll_Empresa 
inner join 
(
    select 
    t1.CompanyID, 
    T2.CompanyDb, 
    t1.OurNumber, 
    T6.BankCode, 
    T6.BankName, 
    T3.[Description] Situation, 
    T1.[Status], 
    T5.Descrption nomeStatus, 
    T1.Origin, 
    T1.DocEntry, 
    T1.DocType, 
    T1.ControlKey, 
    T1.CardCode, 
    T4.[Description] ContractBank, 
    T1.PayMethodCode, 
    T1.DueDate, 
    T1.DocDate, 
    T1.InstallmentID, 
    T1.InstallmentValue, 
    T1.Correction, 
    T1.InterestContractural, 
    T1.FineContract, 
    T1.ValueAbatment, 
    T1.ValueDiscount, 
    T1.ValueFineLate, 
    T1.ValueInterestDaysOfLate, 
    T1.OtherIncreases, 
    T1.ValueInWords, 
    T1.ValueDocument, 
    T1.DigitalLine, 
    T1.Document 
    from [IntegrationBank]..BillOfExchange T1 with (nolock) 
    inner join [InterCompany2]..CompanyHierarchy T2 with (nolock) on T1.CompanyID = T2.ID 
    left join [IntegrationBank]..BillOfExchangeSituation T3 with (nolock) on T1.Situation = T3.ID 
    inner join [IntegrationBank]..ContractBank T4 with (nolock) on T1.ContractBank = T4.ID 
    inner join [IntegrationBank]..BoeStatus T5 with (nolock) on T1.[Status] = T5.ID 
    inner join [UNION_ALL_BASES]..ODSC T6 with (nolock) on T4.BankKey = T6.AbsEntry and T2.CompanyDb = T6.UnionAll_Empresa 
    where T1.[Status] <> 5 
) TBI on (T1.DocEntry = TBI.DocEntry and T1.InstlmntID = TBI.InstallmentID and TBI.DocType = T1.ObjType and TBI.CompanyDb = T0.UnionAll_Empresa) 
inner join [UNION_ALL_BASES]..OCTG T2 on T0.GroupNum = T2.GroupNum and T0.UnionAll_Empresa = T2.UnionAll_Empresa 
inner join [UNION_ALL_BASES]..OSLP T3 on T0.SlpCode = T3.SlpCode and T0.UnionAll_Empresa = T3.UnionAll_Empresa 
where not exists (
    select 1 
    from [UNION_ALL_BASES]..RIN1 A with (nolock) 
    inner join [UNION_ALL_BASES]..ORIN B with (nolock) on A.DocEntry = B.DocEntry and A.UnionAll_Empresa = B.UnionAll_Empresa 
    where A.BaseEntry = T0.DocEntry 
    and B.SeqCode = ''1'' 
) 

यह पूरी तरह से आपके पास क्या है के बराबर है, और अपने सबक्वेरी से T0 के लिए किसी भी संदर्भ को हटा।