जॉइन के अंदर सेलेक्ट स्टेटमेंट में जहां क्लॉज को हार्ड कोड किए बिना उन मानों को पास करने की आवश्यकता होगी, लेकिन मैं सिर्फ TN.id1 = b.id1, ​​TN.id2 = b.id2, आदि ... को अंदर नहीं रख सकता। वह कथन क्योंकि इसे बाध्य नहीं किया जा सकता है।

SELECT 
a.DateCreated, 
*
from B1 b
LEFT JOIN
(
SELECT 
    MIN(GGI.DATE) DateCreated,
    GI.TEXT, 
    TN.ID1, 
    TN.ID2, 
    TN.ID3 
FROM TABLENAME TN
LEFT JOIN GITEM GI ON 
GI.SEQ_NBR = TN.SEQ_NBR
AND GI.STATUS = 'Approved'
WHERE 
    TN.ID1 = 'AP17' 
    AND TN.ID2 = '0' 
    AND TN.ID3 = '1'
GROUP BY GI.TEXT, TN.ID1, TN.ID2, TN.ID3
) a ON 
b.ID1 = a.ID1 
AND b.ID2 = a.ID2
AND b.ID3 = a.ID3
WHERE   b.ID1 = 'AP17' 
    AND b.ID2 = '0' 
    AND b.ID3 = '1'

क्या इसे सबक्वायरी के बिना फिर से लिखा जा सकता है?

मैं ऐसा कुछ करने की कोशिश कर रहा हूं (उपरोक्त क्वेरी से अंश):

    WHERE 
    TN.ID1 = b.ID1
    AND TN.ID2 = b.ID2 
    AND TN.ID3 = b.ID3
GROUP BY GI.TEXT, TN.ID1, TN.ID2, TN.ID3

नमूना डेटा:

इस तालिका में तालिका "तालिका 1" मुझे केवल पहली पंक्ति की परवाह है।

ID1  ID2 ID3  Text
AP17  0   1    Red
AP17  0   2    Green
AP17  0   3    Blue

तालिका "तालिका 2" - इस तालिका से मुझे सभी "SEQ_NBR" पंक्तियों का उपयोग करने की आवश्यकता है जो अगली तालिका में डेटा प्राप्त करने के लिए अंतिम तालिका में पहली पंक्ति से मेल खाते हैं।

ID1 ID2 ID3  SEQ_NBR
AP17  0   1     1
AP17  0   1     2
AP17  0   1     3
AP17  0   2     4

तालिका "तालिका 3" - मैं प्रत्येक अलग प्रकार के "आइटम" के लिए पंक्तियाँ बनाना चाहता हूँ, जिसकी स्थिति "ए" पर सेट की गई थी।

SEQ_NBR Status   Item         DATE
  1       I      APPLE     12/05/17
  2       A      APPLE     12/10/17
  3       A      APPLE     12/13/17
  1       A      Cup       12/05/17
  2       A      Cup       12/10/17
  3       A      Cup       12/13/17
  1       I      Item3     12/05/17
  2       I      Item3     12/10/17
  3       A      Item3     12/13/17

मैं जो डेटा खींच रहा हूं वह ऐसा दिखेगा जिसकी हमेशा "तालिका 3" में सबसे पुरानी तारीख होगी जहां स्थिति "ए" पर सेट की गई थी:

DateCreated  ID1  ID2 ID3  Item
12/10/17     AP17  0   1   Apple
12/05/17     AP17  0   1   Cup
12/13/17     AP17  0   1   Item3
0
user3266638 15 पद 2017, 19:29

2 जवाब

सबसे बढ़िया उत्तर

बहुत यकीन है कि यह एक मूल समग्र क्वेरी है। यह प्रदान किए गए नमूना डेटा के लिए वांछित आउटपुट देता है।

select DateCreated = MIN(MyDate)
    , t2.ID1
    , t2.ID2
    , t2.ID3
    , t3.Item
from Table1 t1
join Table2 t2 on t2.ID1 = t1.ID1
                and t2.ID2 = t1.ID2
join Table3 t3 on t3.SEQ_NBR = t2.SEQ_NBR
                and t3.Status = 'A'
group by t2.ID1
    , t2.ID2
    , t2.ID3
    , t3.Item
1
Sean Lange 15 पद 2017, 20:58

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

SELECT
    git.date,
    table3.id1,
    table3.id2,
    table3.id3,
    b1.text
FROM
    gitem as git
    INNER JOIN table3 ON
        git.seq_nbr = table3.seq_nbr
    INNER JOIN b1 ON
        table3.id1 = b1.id1 AND
        table3.id2 = b1.id2 AND
        table3.id3 = b1.id3
WHERE
    git.status = 'A' AND
    git.date = (SELECT min(date) FROM gitem WHERE status='A')

यह रंग, id1, id2, id3, और तारीख को खींच लेगा जहां तारीख 'ए' की स्थिति के साथ पहली तारीख है। ऐसा लगता है कि क्वेरी क्या कर रही है, इसके बारे में थोड़ा स्पष्ट है, लेकिन यह अभी भी एक सबक्वायरी का उपयोग करता है। यह सिर्फ इतना है कि सबक्वेरी केवल आपकी आवश्यकताओं के अनुसार सही gitem रिकॉर्ड खोजने के लिए है।

0
JNevill 15 पद 2017, 20:10