sql >> データベース >  >> RDS >> Sqlserver

左結合が null を返さないのはなぜですか?

    join items i を変更します ... LEFT join items i へ ...そして、クエリは期待どおりに機能するはずです。

    編集
    NULL を考慮しない限り、where 句で LEFT JOIN テーブルをフィルタリングすることはできません。なぜなら、左結合では、一致する行がない場合にこれらの列に値を持たせたり、NULL にしたりすることができるからです。

    and i.siteid = 132 NULL i.siteid を持つ行はすべて破棄されます 、何も存在しなかった場所。これをオンにします:

    left join items i on ic.itemid = i.itemid and i.siteid = 132

    または WHERE ハンドルを NULL にします:

    WHERE ... AND (i.siteid = 132 OR i.siteid IS NULL)

    編集 OPの編集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
    

    OP の後に何があるかは 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. MariaDBでのTO_BASE64()のしくみ

    2. リストをMySQLストアドプロシージャに渡し、すべての値が存在することを確認します

    3. RDBMSとNoSQLのブリッジング:2DXUIクラスターの概要

    4. PHP配列を列に並べ替える