代码之家  ›  专栏  ›  技术社区  ›  Tim Morton

将用户提供的列表与表进行比较,不匹配的行为空

  •  0
  • Tim Morton  · 技术社区  · 7 年前

    给出了一个用户提供的数字列表,我将其称为 myList ,我想找出哪些与表匹配 MasterList ,以及哪些为空(不匹配)

    因此,给定db内容

    MasterList
    ----------
    
    ID    Number
    1     3333333
    2     4444444
    3     5555555
    

    如果 myList公司 ['1111111','2222222','3333333','4444444']

    我想要以下输出:

    1111111, null
    2222222, null
    3333333, 1
    4444444, 2   
    

    我尝试过的想法:

    当然,这只会产生匹配的结果。

    select Number, ID
    from MasterList
    where Number in('1111111','2222222','3333333','4444444')
    

    我的下一个想法没有什么帮助:

    select temp.Number, master.Number
    from MasterList master 
    left join MasterList temp 
        on master.id=temp.id 
           and temp.Number in('1111111','2222222','3333333','4444444')
    

    如果列表本身是一个表 temp ,获得所需的输出将是微不足道的:

    select temp.number, master.id 
    from temp    -- (ie, the list, where temp.number is the given list)
    left join master on master.number=temp.number
    -- optional where
    where temp.number in('1111111','2222222','3333333','4444444')
    

    这一想法从未实现:

    select temp.number, master.id
    from (select '1111111','2222222','3333333','4444444') temp
    left join master on master.number on.... 
    

    在没有临时表的情况下可以做到这一点吗?

    如果没有,如何在中创建临时表 DB2 ?(如果您已经知道如何操作,IBM文档会很有帮助…)

    2 回复  |  直到 4 年前
        1
  •  4
  •   Rob Wilson    7 年前

    您需要一个外部联接,这里是一个左外部联接(我们需要左边的所有行和右边与联接条件匹配的任何行),正如您在问题中正确地说的那样。在这里,我使用一个公共表表达式(CTE)来动态创建一个临时表。

    WITH inlist (num) as ( VALUES 
      (111111),
      (222222),
      (333333),
      (444444) )
    SELECT num, id 
    FROM inlist LEFT OUTER JOIN masterlist
        ON masterlist.number = inlist.num
    ORDER BY num;
    

    这将产生:

    NUM         ID         
    ----------- -----------  
         111111           -  
         222222           -  
         333333           1  
         444444           2  
    
      4 record(s) selected.
    
        2
  •  1
  •   tysonwright    7 年前

    我对DB2不是非常熟悉(至少15年没有为它编写SQL,那时也不太熟悉),所以我不知道您需要编辑多少才能使其工作,但我认为这会满足您的需要 (已编辑SQL以使用VALUES子句) :

    SELECT 
        my.Number1,
        CASE WHEN ml.Number1 IS NULL
        THEN NULL
        ELSE ROW_NUMBER() OVER (ORDER BY my.Number1) END AS Indicator
    FROM 
        (VALUES ('1111111'),('2222222'),('3333333'),('4444444')) 
        AS my(Number1)
    LEFT JOIN
        MasterList AS ml
    ON
        my.Number1 = ml.Number1;