मुझे एक सबक्वायरी के साथ मुश्किल हो रही है। सादे अंग्रेजी में मैं QCUsers तालिका से एक यादृच्छिक उपयोगकर्ता आईडी चुनने का प्रयास कर रहा हूं जिसमें QCTier1_Assignments तालिका से 20 से कम रिकॉर्ड हैं। समस्या यह है कि नीचे दी गई मेरी क्वेरी केवल उन उपयोगकर्ताओं को चुन रही है जहां यह आंतरिक क्वेरी के मानदंडों को पूरा करती है जब मुझे QCUsers तालिका से किसी भी उपयोगकर्ता को चुनने की आवश्यकता होती है, भले ही उपयोगकर्ता के पास QCTier1_Assignments तालिका में कोई रिकॉर्ड न हो। मुझे कुछ ऐसा ही चाहिए

और (सब.क्यूसीकाउंट <20 या सब.क्यूसीकाउंट = 0)

DECLARE @ReviewPeriodMonth varchar(10) = '10'
DECLARE @ReviewPeriodYear varchar(10) = '2015'

SELECT TOP 1
E1.UserID
,Sub.QCCount --Drawn from the subquery
FROM QCUsers E1
JOIN (SELECT 
  QCA.UserID, 
  COUNT(*) AS QCCount
  FROM QCTier1_Assignments QCA 
  WHERE QCA.ReviewPeriodMonth = @ReviewPeriodMonth
  AND QCA.ReviewPeriodYear = @ReviewPeriodYear
  GROUP BY QCA.UserID
  ) Sub
 ON E1.UserID = Sub.UserID
 WHERE Active = 1
  AND Grade = 12
  AND Sub.QCCount < 20
 ORDER BY NEWID()

मैंने भी बिना किसी किस्मत के इसे इस तरह से आजमाया

DECLARE @ReviewPeriodMonth varchar(10) = '10'
DECLARE @ReviewPeriodYear varchar(10) = '2015'

SELECT TOP 1
E1.UserID
,Sub.QCCount --Drawn from the subquery
FROM QCUsers E1
RIGHT JOIN (SELECT 
  QCA.UserID,
  ReviewPeriodMonth,
  ReviewPeriodYear, 
  COUNT(*) AS QCCount
  FROM QCTier1_Assignments QCA       
  GROUP BY 
    QCA.UserID,
    ReviewPeriodMonth,
    ReviewPeriodYear
  ) Sub
ON E1.UserID = Sub.UserID
WHERE Active = 1
  AND Grade = 12
  AND Sub.QCCount < 20
  AND Sub.ReviewPeriodMonth = @ReviewPeriodMonth
  AND Sub.ReviewPeriodYear = @ReviewPeriodYear
ORDER BY NEWID()
1
user3641053 16 नवम्बर 2017, 23:33

3 जवाब

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

अपनी दूसरी क्वेरी का उपयोग करने का प्रयास करें लेकिन WHERE क्लॉज को COALESCE(Sub.QCCount, 0) instead of justSub.QCCount` का उपयोग करने के लिए बदलें

यदि सबक्वायरी कोई पंक्ति नहीं लौटाती है तो आपके RIGHT JOIN के साथ आपको कम से कम अभी भी पंक्ति मिल जाएगी, लेकिन QCCount NULL होगा, जिसके परिणामस्वरूप किसी भी चीज़ की तुलना में प्रभावी रूप से "झूठा" होगा।

साथ ही, आपको HAVING क्लॉज पर भी गौर करना चाहिए। यह आपको बिना सबक्वायरी के ऐसा करने की अनुमति दे सकता है।

यहां HAVING खंड के साथ एक उदाहरण दिया गया है। यदि यह सही परिणाम नहीं देता है तो कृपया मुझे बताएं क्योंकि मैं इसका परीक्षण करने में सक्षम नहीं हूं।

DECLARE
    @ReviewPeriodMonth VARCHAR(10) = '10'
    @ReviewPeriodYear  VARCHAR(10) = '2015'

SELECT TOP 1
    E1.UserID,
    COUNT(QCA.UserID) AS QCCount
FROM
    QCUsers E1
LEFT OUTER JOIN QCTier1_Assignments QCA ON
    QCA.UserID = E1.UserID AND
    QCA.ReviewPeriodMonth = @ReviewPeriodMonth AND
    QCA.ReviewPeriodYear = @ReviewPeriodYear
WHERE
    E1.Active = 1 AND
    Grade = 12 AND
HAVING
    COUNT(*) < 20
ORDER BY
    NEWID()
2
Tom H 17 नवम्बर 2017, 00:56

आपको JOIN(INNER JOIN) के बजाय LEFT JOIN का उपयोग करना चाहिए, और बेहतर होगा कि आप अपने अभ्यास के आधार पर विधेय को बाहरी क्वेरी पर रखें, लेकिन मैं निम्नलिखित तरीके की अनुशंसा करता हूं:

SELECT TOP1 ABC.UserID,ABC.QCCount
FROM
(
    SELECT E1.UserID, COUNT(*) as QCCount
    FROM QCUsers as E1
    LEFT JOIN QCTier1_Assignments as QCA 
    ON QCA.UserID = E1.UserID
    WHERE QCA.ReviewPeriodMonth = @ReviewPeriodMonth
    AND QCA.ReviewPeriodYear = @ReviewPeriodYear
    AND Active = 1
    AND Grade = 12
    GROUP BY E1.UserID 
 ) as ABC
WHERE ABC.QCCount <20
ORDER BY NEWID()
0
LONG 16 नवम्बर 2017, 23:42

मैं यहां प्रतिक्रियाओं के संयोजन के माध्यम से इसे हल करने में सक्षम था

DECLARE @ReviewPeriodMonth varchar(10) = '10'
DECLARE @ReviewPeriodYear varchar(10) = '2015'

SELECT TOP 1 
  QCUsers.UserID, 
  COUNT(QCTier1_Assignments.ReviewID) AS ReviewCount
FROM         
QCTier1_Assignments RIGHT OUTER JOIN
QCUsers ON QCTier1_Assignments.UserID = QCUsers.UserID
WHERE     
QCUsers.Active = 1
AND QCUsers.Grade = '12'
AND (ReviewPeriodMonth = @ReviewPeriodMonth OR ReviewPeriodMonth IS NULL)
AND (ReviewPeriodYear = @ReviewPeriodYear OR ReviewPeriodYear IS NULL)
GROUP BY 
QCUsers.UserID
HAVING      
(COALESCE(COUNT(QCTier1_Assignments.ReviewID),0) < 4)
ORDER BY NEWID()
0
user3641053 17 नवम्बर 2017, 00:57