代码之家  ›  专栏  ›  技术社区  ›  Carley Guidry

是否根据子项的特征查询主项?

  •  0
  • Carley Guidry  · 技术社区  · 7 年前

    如果标题的措词没有意义,我很抱歉。

    我有一张包含订单和订单项目的表格。我下了一个小订单,让你看看我指的是什么。

    Sample Data

    查看附件时:

    • [订单号]只是订单号
    • [唯一ID]是分配给订单中每个项目的唯一ID。
    • [Asm Main]表示项目是主项目还是子项目 项目
    • [Asm Num]是将子项链接到其主项的编号 项目(子项和主项将具有相同的[Asm Num])
    • 选择[项目编号]是为了更容易理解 主/子项已链接。
    • [承诺日期]和[发货日期]是我需要关注的两个日期。

    这就是我想做的。我想在以下情况下拉动主要项目:

    • 主项的[Date Promisted]字段为空
    • 并且该主项目的所有子项目的[发货日期]都不为空。

    澄清更新: 当Asm Main=0时,我需要发货日期不为null。当Asm Main=1时,发货日期无关紧要,我只需要承诺的日期为null。

        SELECT bo.[Order Number],boi.[Unique ID]
        from [Booked Order Items] boi JOIN [Booked Orders] bo ON boi.[Order Number] = bo.[Order Number] 
        WHERE boi.[Asm Main]=1 AND boi.[Date Promised] IS NULL
    

    很明显,我可以迈出第一步,但是 只有 具有 全部 他们的子项没有空的发货日期以及上述条件,我就是搞不清楚。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Vash    7 年前

    使用与您相同的逻辑连接两个表,获取主要项(以及 Asm Num )在查询A中,对查询B中的子项应用类似的逻辑,方法是使用 Ship Date IS NULL 如果计数大于0,则表示您不希望主项具有相应的 Asm编号 因为所有子项都必须 发货日期 NOT NULL 根据您的要求。因此情况 and B.[sub_items_null_dates] = 0 加入时 A B .

    select A.[Order Number], A.[Unique ID]
    from
    (   select bo.[Order Number], boi.[Unique ID], boi.[Asm Num]
        from
        [Booked Order Items] boi JOIN [Booked Orders] bo
        on boi.[Order Number] = bo.[Order Number]
        where boi.[Asm Main] = 1 and boi.[Date Promised] IS NULL
    ) A
    JOIN
    (   select bo.[Order Number], boi.[Asm Num],
        SUM(CASE WHEN boi.[Ship Date] IS NULL THEN 1 ELSE 0 END) as sub_items_null_dates
        from    
        [Booked Order Items] boi JOIN [Booked Orders] bo
        on boi.[Order Number] = bo.[Order Number]
        where boi.[Asm Main] = 0
        GROUP BY bo.[Order Number], boi.[Asm Num]
    ) B
    ON A.[Order Number] = B.[Order Number] 
    and A.[Asm Num] = B.[Asm Num]
    and B.[sub_items_null_dates] = 0;
    
        2
  •  0
  •   Gordon Linoff    7 年前

    如果你只是想要订单,我会同意的 NOT EXISTS :

    SELECT bo.*
    FROM [Booked Orders] bo
    WHERE bo.[Date Promised] IS NULL AND
          NOT EXISTS (SELECT 1
                      FROM [Booked Order Items] boi
                      WHERE boi.[Order Number] = bo.[Order Number]  AND
                            boi.[Ship Date] IS NULL
                     );
    

    (我不清楚ASM数字如何匹配。)

    如果您使用的是MySQL,则可以通过以下操作获取项目:

    SELECT boi.*
    FROM [Booked Order Items] boi JOIN
         [Booked Orders] bo
         ON boi.[Order Number] = bo.[Order Number] 
    WHERE bo.[Date Promised] IS NULL AND
          NOT EXISTS (SELECT 1
                      FROM [Booked Order Items] boi2
                      WHERE boi2.[Order Number] = bo.[Order Number]  AND
                            boi2.[Ship Date] IS NULL
                     )