【问题标题】:How to make Left join or Inner join in my Scenario using Sql server?如何使用 Sql server 在我的场景中进行左连接或内连接?
【发布时间】:2017-06-20 23:52:18
【问题描述】:

我想把左表的所有记录都拿出来,也想显示右表与左表匹配的记录。

1.ItemDynamic [左表]

ItemID    StoreID    SnapShotQuantity
-------------------------------------
111       1201          50
111       1001          25
111       5000          75
111       7777          100

2.Sub Query我的右表是sub query

这是我的子查询

SELECT 
    ViewItemMovement.ItemLookupCode,
    ViewItemMovement.StoreID,
    ViewItemMovement.ItemDescription,
    ViewItemMovement.Brand,
    Sum(ViewItemMovement.Quantity) Quantity,
    ItemDynamic.SnapShotQuantity SnapShotQuantity,
    ItemDynamic.SnapShotQuantity - Sum(ViewItemMovement.Quantity) SOH,
    Item.cost,
    (ItemDynamic.SnapShotQuantity - Sum(ViewItemMovement.Quantity)) * Item.cost AS ExtendedCost

FROM 
    FT_ViewItemMovement ViewItemMovement 
    left join Item with(NoLock) on Item.ItemLookupCode = ViewItemMovement.ItemLookupCode 
    left join ItemDynamic with(NoLock) on ItemDynamic.ItemID = Item.ID and ItemDynamic.StoreID = ViewItemMovement.StoreID

WHERE brand = 'PEPSI'
Group By  
    ViewItemMovement.ItemLookupCode,
    ViewItemMovement.StoreID,
    ViewItemMovement.ItemDescription,
    ViewItemMovement.Brand,
    Item.Cost,
    ItemDynamic.SnapShotQuantity

子查询结果如下所示

ItemID    StoreID    Quantity    SnapShotQuantity   (pls leave other columns)
-------------------------------------------------
111       1201       335            50
111       1001       223            25

3.Item [此表有ItemLookupCode的ID,称为ItemID]

ItemLookupCode   ID
------------------------
11121111         111

我尝试了以下查询,将 ItemDynamic 中的所有记录与 ItemID 和 StoreID [左表]子查询 [右表] 中的匹配记录一起显示,它显示 Quantity、SnapshotQuantity、扩展价格

select 
    id.ItemID,
    id.StoreID,
    ViewItemMovements.ItemLookupCode,
    ViewItemMovements.ItemDescription,
    ViewItemMovements.Brand,
    case when item.ItemLookupCode = item.ItemLookupCode 
        and id.StoreID = ViewItemMovements.StoreID then ViewItemMovements.Quantity 
        else 0 end Quantity,
    id.SnapShotQuantity,
    case when item.ItemLookupCode = item.ItemLookupCode 
        and id.StoreID = ViewItemMovements.StoreID then ViewItemMovements.SOH
        else id.SnapShotQuantity end SOH,

    Item.cost,
    (id.SnapShotQuantity - (case when item.ItemLookupCode = item.ItemLookupCode 
        and id.StoreID = ViewItemMovements.StoreID then ViewItemMovements.Quantity 
        else 0 end))* Item.cost AS ExtendedCost

from 
    ItemDynamic id
    left join Item with(NoLock) on Item.ID = id.ItemID 
    left join (
        SELECT 
            ViewItemMovement.ItemLookupCode,
            ViewItemMovement.StoreID,
            ViewItemMovement.ItemDescription,
            ViewItemMovement.Brand,
            Sum(ViewItemMovement.Quantity) Quantity,
            ItemDynamic.SnapShotQuantity SnapShotQuantity,
            ItemDynamic.SnapShotQuantity - Sum(ViewItemMovement.Quantity) SOH,
            Item.cost,
            (ItemDynamic.SnapShotQuantity - Sum(ViewItemMovement.Quantity)) * Item.cost AS ExtendedCost

        FROM 
            FT_ViewItemMovement ViewItemMovement 
            left join Item with(NoLock) on Item.ItemLookupCode = ViewItemMovement.ItemLookupCode 
            left join ItemDynamic with(NoLock) on ItemDynamic.ItemID = Item.ID and ItemDynamic.StoreID = ViewItemMovement.StoreID

        --WHERE brand = 'PEPSI'
        Group By  
            ViewItemMovement.ItemLookupCode,
            ViewItemMovement.StoreID,
            ViewItemMovement.ItemDescription,
            ViewItemMovement.Brand,
            Item.Cost,
            ItemDynamic.SnapShotQuantity
) ViewItemMovements     on ViewItemMovements.ItemLookupCode = Item.ItemLookupCode 
    and ViewItemMovements.StoreID = id.StoreID 
    where  ViewItemMovements.Brand = 'pepsi' and id.StoreID <> 1303
    order by ViewItemMovements.ItemLookupCode,StoreID

我更加重视以下列,尤其是 Quantity 和 SnapShotQuantity,如下所示

ItemID    StoreID    Quantity    SnapShotQuantity  (pls leave other columns) 
-------------------------------------------------
111       1201       335            50
111       1001       223            25
111       5000        0             75
111       7777        0             100

但我只有在运行整个查询时才能得到子查询结果。我做错了什么

【问题讨论】:

    标签: sql sql-server join stored-procedures left-join


    【解决方案1】:

    您的问题是,由于您的 WHERE 子句,您的 LEFT JOIN 变得像 INNER JOIN

    为了快速说明问题,假设我有以下查询:

    DECLARE @A TABLE (i INT);
    INSERT @A (i) VALUES (1), (2), (3);
    
    DECLARE @B TABLE (i INT);
    INSERT @B (i) VALUES (2), (3);
    
    SELECT *
    FROM @A AS A
    LEFT JOIN @B AS B ON B.i = A.i;
    

    我将得到三行结果:(1, null), (2, 2), (3, 3)

    但是假设我只想加入 i = 3 的表 B。如果我像这样更改查询:

    DECLARE @A TABLE (i INT);
    INSERT @A (i) VALUES (1), (2), (3);
    
    DECLARE @B TABLE (i INT);
    INSERT @B (i) VALUES (2), (3);
    
    SELECT *
    FROM @A AS A
    LEFT JOIN @B AS B ON B.i = A.i
    WHERE B.i = 3;
    

    结果我只得到一行:(3, 3)

    我应该做的是让 WHERE 子句成为 LEFT JOIN 的一部分,如下所示:

    DECLARE @A TABLE (i INT);
    INSERT @A (i) VALUES (1), (2), (3);
    
    DECLARE @B TABLE (i INT);
    INSERT @B (i) VALUES (2), (3);
    
    SELECT *
    FROM @A AS A
    LEFT JOIN @B AS B ON B.i = A.i AND B.i = 3;
    

    我的结果将如下所示:(1, null), (2, null), (3, 3) 因为它是 LEFT JOIN 条件的一部分,而不是末尾的 WHERE 子句

    这里的TL;DR是你应该改变这部分:

    where ViewItemMovements.Brand = 'pepsi' and id.StoreID &lt;&gt; 1303

    到这里:

    AND ViewItemMovements.Brand = 'pepsi' WHERE id.StoreID &lt;&gt; 1303

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多