मैं अपने आप को कुछ गड़बड़ कर रहा हूं जो मैं कर रहा हूं जहां मैं जानकारी के कई बिट्स के आधार पर दो तालिकाओं को एक साथ जोड़ने की कोशिश कर रहा हूं।

मैं (इस पदानुक्रम में) के बुनियादी नियमों के आधार पर एक तालिका को दूसरे से जोड़ना चाहता हूं

  • जहां मुख्य लिंकिंग वह जगह है जहां ऑर्डरिड दो तालिकाओं के बीच मेल खाता है
  • तालिका 2 से रिकॉर्ड जहां वैध = वाई,
  • उनमें से मैं वैध रिकॉर्ड चाहता हूं जिसमें उच्चतम seqn1 संख्या है और फिर उन लोगों से जिनके पास उच्चतम seqn2 मान है

तालिका1

orderid | date       | otherinfo   
223344  | 22/10/2020 | okokkokokooeodijjf

तालिका2

orderid | seqn1 | seqn2 | valid | additonaldata 

223344  | 1     | 3     | y     | sdfsfsf        
223344  | 2     | 1     | y     | sffferfr       
223344  | 2     | 2     | y     | sfrfrefr  -- This row   
223344  | 2     | 3     | n     | rfrg66rr       
223344  | 2     | 4     | n     | adwere         
223344  | 3     | 4     | n     | adwere   

तो चाहते हैं कि अंतिम रिकॉर्ड हो

orderid | date       | otherinfo          | seqn1 | seqn2 | valid | additonaldata 
223344  | 22/10/2020 | okokkokokooeodijjf | 2     | 2     | y     | sfrfrefr    

मैंने नीचे दिए गए कोड के साथ शुरुआत की लेकिन मुझे यकीन नहीं है कि मैं इसे सही कर रहा हूं और जब मैं इसे जोड़ने का प्रयास करता हूं तो मुझे वैध ध्वज पर ध्यान देना प्रतीत नहीं होता है।

SELECT * FROM table1
left JOIN table2
ON table1.orderid = table2.orderid
AND table2.seqn1 = (SELECT MAX(table2.seqn1) FROM table2 WHERE table1.orderid = table2.orderid)
AND table2.seqn2 = (SELECT MAX(table2.seqn2) FROM table2 WHERE table1.orderid = table2.orderid 
AND table2.seqn1 = (SELECT MAX(table2.seqn1) FROM table2 WHERE table1.orderid = table2.orderid))

क्या कोई कृपया मुझे कोड में संशोधन करने में मदद कर सकता है।

0
SQL_newbie 22 अक्टूबर 2020, 16:55

2 जवाब

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

row_number एनालिटिकल फंक्शन जिसमें ऑर्डरिड द्वारा पार्टिशन और SEQNRs के हिसाब से ऑर्डर आपको चाहिए। एकाधिक उप-चयनों की कोई आवश्यकता नहीं है। एकल पंक्ति के लिए और चयन जोड़ने के लिए, CASE का उपयोग करके अपने मानों को संख्याओं और उनके द्वारा क्रमित करने के लिए मैप करें।

यहां फिडल करें

with l as (
  select *,
    rank() over(partition by orderid order by seqn1 desc, seqn2 desc) as rn
  from line
  where valid = 'y'
)
select *
from header as h
  join l
    on h.orderid = l.orderid
      and l.rn = 1
1
astentx 22 अक्टूबर 2020, 17:32

इस जैसे किसी और के बारे में क्या राय है:

;
with cte_table2 as 
(
SELECT  ordered
       ,MAX(seqn1) as seqn1
       ,MAX(seqn2) as seqn2
FROM   table2
where  valid = 'y'
group by ordered --check if you need to add 'valid' to the group by but I don't think so.
)
SELECT
       t1.*
       ,t3.otherinfo          
       --,t3.[OtherFields]
from table1 t1
inner join cte_table2 t2 on t1.orderid = t2.orderid -- first match on id
left join table2 t3 on t3.orderid = t2.orderid and t3.seqn1 = t2.seqn1 and t3.seqn2 = t2.seqn2
0
Craig Gers 22 अक्टूबर 2020, 17:27