मुझे एक सबक्वायरी के साथ मुश्किल हो रही है। सादे अंग्रेजी में मैं 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()
3 जवाब
अपनी दूसरी क्वेरी का उपयोग करने का प्रयास करें लेकिन WHERE
क्लॉज को COALESCE(Sub.QCCount, 0) instead of just
Sub.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()
आपको 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()
मैं यहां प्रतिक्रियाओं के संयोजन के माध्यम से इसे हल करने में सक्षम था
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()
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।