मेरे पास एक समस्या है जहां मैं दो तालिकाओं में शामिल होना चाहता हूं जहां बाईं ओर 1 रिकॉर्ड है और कई दाईं ओर हैं, लेकिन केवल उन सभी अभिलेखों में मौजूद दाईं ओर से जानकारी की आवश्यकता है - दूसरे शब्दों में, केवल 1 प्राप्त करने पर जोर दें: मेरे परिणामों में 1 नहीं 1:n।

उदाहरण, यदि मैं इस कथन को नीचे चलाता हूं, तो मुझे WHERE कथन के लिए 2 रिकॉर्ड मिलते हैं:

SELECT TOP (1000) bi.*
FROM [DB4_Default].[dbo].[t_LinkBreakInfo] AS bi
WHERE bi.LinkID = 58150701 

जब मैं एक तालिका में शामिल होता हूं जिसमें ऊपर की क्वेरी से लौटाए जाने की तुलना में अधिक जानकारी होती है, तो उसे दाहिने हाथ की ओर 7 रिकॉर्ड मिलते हैं। तो, नीचे दिए गए कथन का परिणाम 2 x 7 = 14 पंक्तियों में होता है।

SELECT TOP (1000) bi.*, nav.security_name
FROM [DB4_Default].[dbo].[t_LinkBreakInfo] AS bi
  JOIN [DB4_Default].[dbo].[Positions] AS nav
    ON bi.LinkID = nav.link_identifier
WHERE bi.LinkID = 58150701 
  AND nav.data_origin_type = 'Local'

मैं अभी भी पहले कथन उदाहरण के अनुसार केवल 2 रिकॉर्ड चाहता हूं लेकिन शामिल होने से कॉलम मान के अतिरिक्त।

कोई विचार?

0
Matt Lightbourn 30 जिंदा 2020, 01:07

2 जवाब

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

आप द्वि-पंक्ति के लिए बस कोई भी सुरक्षा_नाम चाहते हैं, चाहे जो भी हो। आइए न्यूनतम (पहले वर्णमाला में) लें। SELECT क्लॉज में इसे चुनना सबसे आसान तरीका है:

SELECT
  bi.*, 
  (
    SELECT MIN(nav.security_name)
    FROM db4_default.dbo.positions AS nav
    WHERE nav.link_identifier = bi.linkid
    AND nav.data_origin_type = 'Local'
  ) AS secname
FROM db4_default.dbo.t_linkbreakinfo bi
WHERE bi.linkid = 58150701;

वैकल्पिक रूप से FROMखंड में:

SELECT bi.*, nav.secname
FROM db4_default.dbo.t_linkbreakinfo bi
LEFT JOIN
(
  SELECT link_identifier, MIN(security_name) AS secname
  FROM db4_default.dbo.positions
  WHERE data_origin_type = 'Local'
  GROUP BY link_identifier
) nav ON nav.link_identifier = bi.linkid
WHERE bi.linkid = 58150701;
1
Thorsten Kettner 30 जिंदा 2020, 02:04

आप एक लेटरल जॉइन का उपयोग कर सकते हैं, जो SQL सर्वर में APPLY कीवर्ड का उपयोग करता है:

SELECT TOP (1000) bi.*, nav.security_name
FROM [DB4_Default].[dbo].[t_LinkBreakInfo] bi CROSS APPLY
     (SELECT TOP (1) nav.*
      FROM [DB4_Default].[dbo].[Positions] nav
      WHERE bi.LinkID = nav.link_identifier AND
            nav.data_origin_type = 'Local'
      ORDER BY nav.position_date
     ) nav
WHERE bi.LinkID = 58150701 ;

आम तौर पर, सबक्वायरी में एक ORDER BY होगा, मैंने आपकी टिप्पणी पर एक जोड़ा।

सबक्वेरी के प्रदर्शन के लिए, आप Positions(LinkId, data_origin_type, position_date) पर एक इंडेक्स चाहते हैं।

1
Gordon Linoff 30 जिंदा 2020, 01:30