मैं अपने आप को कुछ गड़बड़ कर रहा हूं जो मैं कर रहा हूं जहां मैं जानकारी के कई बिट्स के आधार पर दो तालिकाओं को एक साथ जोड़ने की कोशिश कर रहा हूं।
मैं (इस पदानुक्रम में) के बुनियादी नियमों के आधार पर एक तालिका को दूसरे से जोड़ना चाहता हूं
- जहां मुख्य लिंकिंग वह जगह है जहां ऑर्डरिड दो तालिकाओं के बीच मेल खाता है
- तालिका 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))
क्या कोई कृपया मुझे कोड में संशोधन करने में मदद कर सकता है।
2 जवाब
row_number एनालिटिकल फंक्शन जिसमें ऑर्डरिड द्वारा पार्टिशन और SEQNR
s के हिसाब से ऑर्डर आपको चाहिए। एकाधिक उप-चयनों की कोई आवश्यकता नहीं है। एकल पंक्ति के लिए और चयन जोड़ने के लिए, 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
इस जैसे किसी और के बारे में क्या राय है:
;
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
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।