Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मेरा बायां जुड़ाव नल वापस क्यों नहीं कर रहा है?

बदलें आइटम में शामिल हों i ... से बाएं आइटम में शामिल हों i ... और आपकी क्वेरी को आपकी अपेक्षा के अनुरूप काम करना चाहिए।

संपादित करें
जब तक आप नल के लिए खाते नहीं हैं, तब तक आप LEFT JOIN टेबल को उस क्लॉज में फ़िल्टर नहीं कर सकते हैं, क्योंकि लेफ्ट जॉइन उन कॉलमों को एक मान या शून्य होने की अनुमति देता है जब कोई पंक्तियाँ मेल नहीं खाती हैं:

और i.siteid =132 आपकी किसी भी पंक्ति को फेंक देगा जिसमें NULL i.siteid . है , जहां कोई मौजूद नहीं था। इसे चालू पर ले जाएँ:

ic.itemid =i.itemid और i.siteid =132 पर आइटम में शामिल हों

या WHERE को NULLs हैंडल करें:

कहां ... और (i.siteid =132 या i.siteid IS NULL)

संपादित करें ओपी के संपादन 3 पर आधारित

SET NOCOUNT ON
DECLARE @Categories table (CategoryID int,Title varchar(30))
INSERT @Categories VALUES (1,'Cat AAA')
INSERT @Categories VALUES (2,'Cat BBB')
INSERT @Categories VALUES (3,'Cat CCC')

DECLARE @SubCategories table (SubCategoryID int,CategoryID int,Title varchar(30))
INSERT @SubCategories VALUES (1,1,'SubCat AAA A')
INSERT @SubCategories VALUES (2,1,'SubCat AAA B')
INSERT @SubCategories VALUES (3,1,'SubCat AAA C')
INSERT @SubCategories VALUES (4,2,'SubCat BBB A')

DECLARE @ItemCategories table (ItemCategoryID int, ItemID int, SubCategoryID int, IsActive char(1))
INSERT @ItemCategories VALUES (1,1,2,'Y')
INSERT @ItemCategories VALUES (2,2,2,'Y')
INSERT @ItemCategories VALUES (3,3,2,'Y')
INSERT @ItemCategories VALUES (4,4,2,'Y')
INSERT @ItemCategories VALUES (5,7,2,'Y')

DECLARE @Items table (ItemID int, Title varchar(30), SiteID int)
INSERT @Items VALUES (1,'Item A',111)
INSERT @Items VALUES (2,'Item B',111)
INSERT @Items VALUES (3,'Item C',132)
INSERT @Items VALUES (4,'Item D',111)
INSERT @Items VALUES (5,'Item E',111)
INSERT @Items VALUES (6,'Item F',132)
INSERT @Items VALUES (7,'Item G',132)
SET NOCOUNT OFF

मुझे 100% यकीन नहीं है कि ओपी के बाद क्या है, यह उन सभी जानकारी को वापस कर देगा जिन्हें siteid=132 में शामिल किया जा सकता है जैसा कि प्रश्न में दिया गया है

SELECT
    c.title as categorytitle
        ,s.title as subcategorytitle
        ,i.title as itemtitle
        --,i.itemID, ic.SubCategoryID, s.CategoryID
    FROM @Items                          i
        LEFT OUTER JOIN @ItemCategories ic ON i.ItemID=ic.ItemID
        LEFT OUTER JOIN @SubCategories   s ON ic.SubCategoryID=s.SubCategoryID
        LEFT OUTER JOIN @Categories      c ON s.CategoryID=c.CategoryID
    WHERE i.siteid = 132

आउटपुट:

categorytitle                  subcategorytitle               itemtitle
------------------------------ ------------------------------ ------------------------------
Cat AAA                        SubCat AAA B                   Item C
NULL                           NULL                           Item F
Cat AAA                        SubCat AAA B                   Item G

(3 row(s) affected)

यह सभी श्रेणियों को सूचीबद्ध करेगा, भले ही siteid=132 . से कोई मेल न हो

;WITH AllItems AS
(
SELECT
    s.CategoryID, ic.SubCategoryID, ItemCategoryID, i.ItemID
        ,c.title AS categorytitle, s.title as subcategorytitle, i.title as itemtitle
    FROM @Items                          i
        LEFT OUTER JOIN @ItemCategories ic ON i.ItemID=ic.ItemID
        LEFT OUTER JOIN @SubCategories   s ON ic.SubCategoryID=s.SubCategoryID
        LEFT OUTER JOIN @Categories      c ON s.CategoryID=c.CategoryID
    WHERE i.siteid = 132
)
SELECT
    categorytitle, subcategorytitle,itemtitle
    FROM AllItems
UNION
SELECT
    c.Title, s.Title, null
    FROM @Categories                     c
        LEFT OUTER JOIN @SubCategories   s ON c.CategoryID=s.CategoryID
        LEFT OUTER JOIN @ItemCategories ic ON s.SubCategoryID=ic.SubCategoryID
        LEFT OUTER JOIN AllItems         i ON c.CategoryID=i.CategoryID AND  s.SubCategoryID=i.SubCategoryID
    WHERE i.ItemID IS NULL
ORDER BY categorytitle,subcategorytitle

आउटपुट:

categorytitle                  subcategorytitle               itemtitle
------------------------------ ------------------------------ ------------------------------
NULL                           NULL                           Item F
Cat AAA                        SubCat AAA A                   NULL
Cat AAA                        SubCat AAA B                   Item C
Cat AAA                        SubCat AAA B                   Item G
Cat AAA                        SubCat AAA C                   NULL
Cat BBB                        SubCat BBB A                   NULL
Cat CCC                        NULL                           NULL

(7 row(s) affected)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlException (0x80131904):अमान्य ऑब्जेक्ट नाम 'dbo.Categories'

  2. टीएसक्यूएल में फ़ंक्शन पैरामीटर के सामने 'एन' डालने का उद्देश्य क्या है?

  3. एमएस एसक्यूएल में स्व-संदर्भित बाधा

  4. SQL पूरी तालिका को स्थानांतरित करता है

  5. सी # में बिगिंट के बराबर क्या है?