代码之家  ›  专栏  ›  技术社区  ›  Ocelot20

SQL“全部”功能?

  •  0
  • Ocelot20  · 技术社区  · 15 年前

    这可能是一个非常简单的问题,只是很难谷歌一个词像“所有”。

    SELECT a.Id, Max(b.Number)
    FROM Table1 a
    JOIN Table2 b
        ON a.FK = b.Id
    GROUP BY a.Id
    

    编辑-为了澄清(也更改了上面的查询):

    Table1
    Id, FK
    1   1
    1   2
    2   3
    3   4
    3   5
    3   6
    
    Table 2
    Id   Number
    1    1
    2    NULL
    3    10
    4    20
    5    30
    6    40
    

    a.Id   Max Number
    2      10
    3      40
    

    (注意,a.Id=1没有出现,因为b.Number字段之一为空)

    3 回复  |  直到 15 年前
        1
  •  1
  •   Martin Smith    15 年前
    select t1.Id, max(Number) as [Max Number]
    from Table1 t1
    left join Table2 t2 ON t1.FK=t2.Id and t2.Number is not null
    group by t1.Id
    having count(distinct t1.FK) = count(distinct t2.Id)
    
        2
  •  1
  •   Bill Karwin    15 年前

    好吧,你问的问题和我想象的完全不同。我在替换我的答案。

    我处理这个问题的方法是将a和b连接两次——一次获取b中所有匹配的行,另一次连接搜索b中数字为空的行。如果不存在这样的行,那么我们知道它们都是非空的。

    SELECT a.Id, Max(b1.Number)
    FROM Table1 a
    JOIN Table2 b1 ON a.FK = b1.Id
    LEFT OUTER JOIN Table2 b2 ON a.FK = b2.Id AND b2.Number IS NULL
    WHERE b2.Id IS NULL
    GROUP BY a.Id
    

    b2.身份证只有在以下位置找不到行时才会为空b2.编号为空。

        3
  •  0
  •   FatherStorm    15 年前


    来自表1A
    加入表2 b
    关于a.FK=b.Id
    其中b.Id不为空

    推荐文章