【问题标题】:Group By with Right Outer Join使用右外连接分组
【发布时间】:2018-01-08 05:21:05
【问题描述】:

需要结合 group-by 和 right-outer-join。

TableA 有组“a”、“b”、“c”、“d”

TableB 有:12|a, 2|b, 1|a 5|b 3|d 多次。

我将 TableB 分组为这样的组视图:

视图B:13|a 7|b 3|d

如您所见,“c”组不在 TableB 中,也不在 ViewB 中。我需要这样的外部连接:

视图B 13|a 7|b 3|d null|c

我怎样才能做到这一点?

更新。 我明白了,这个简单的例子并没有描述复杂性。 另外我有第三个表“用户” 因此,为每个用户、每个 TableA-Values 分组。 示例

userA| 13| a
userA| 7 | b
userA| 3 | d
userB| 10| a
userB| 70 | b
userB| 30 | d

组“c”不在 TableB 中(TableB 包含组的值) 当我尝试这样的查询时:

select
right outer join TableA
on TableB.id = TableA.id
join TableC
on TableB.other_id = TableC.other_id
group by TableB.groups

我只是得到这样的东西:

null| null| c
userA| 13| a
userA| 7 | b
userA| 3 | d
userB| 10| a
userB| 70 | b
userB| 30 | d

但我需要:

|userA| 13| a
|userA| 7 | b
|userA| 3 | d
|userA| NULL| c
|userB| 10| a
|userB| 70 | b
|userB| 30 | d
|userB| NULL | c

UPDATE_2 抱歉信息少。我使用 oracle g11 这是示例模式的链接:

http://sqlfiddle.com/#!4/71069

应该扩展的我的 Sql-Query 如下所示:

SELECT usr.user_name,
       SUM (lg_all.new_values) AS group_sum,
       allw.group_name
FROM users usr, products lg_all, myGroup allw
      WHERE usr.user_id = lg_all.user_id 
      AND allw.group_id = lg_all.group_id 
   GROUP BY (usr.USER_ID, allw.group_name)
   ORDER BY usr.LOGONUSER_ID DESC

我的结果如下所示:

userA| 13| a
userA| 7 | b
userA| 3 | d
userB| 10| a
userB| 70 | b
userB| 30 | d

但我需要:

|userA| 13| a
|userA| 7 | b
|userA| 3 | d
|userA| NULL| c
|userB| 10| a
|userB| 70 | b
|userB| 30 | d
|userB| NULL | c

谢谢。

【问题讨论】:

  • 你试过正确的加入吗?

标签: sql oracle11g group-by right-join


【解决方案1】:

您通常会为此使用left join

select a.col1, sum(b.col1)
from tableA a left join
     tableB b
     on a.col1 = b.col2
group by a.col1;

【讨论】:

    【解决方案2】:

    如果你特别想使用右连接:

    SELECT 
      a.col, 
      SUM(b.col) as sumof
    FROM 
      TableB b 
      RIGHT JOIN
      TableA a
      ON 
        b.col = a.col
    GROUP BY
      a.col;
    

    右联接要求“具有实体数据的表”以“RIGHT JOIN”一词命名,而“具有缺失数据的表”应在前面。如果您喜欢这样想,没问题!我倾向于一直使用 LEFT 连接,可能是因为我从左到右书写,所以当我将 SQL 放在脑海中时,我会想“什么是实心表……什么是有孔的……”我将“带有数据孔的表格”连接到“实心表格”上,这样实心数据就在左侧,然后将带有孔的数据连接到它上面。

    即我认为从左到右。如果您认为从右到左,您可能更喜欢右侧的实心桌子

    更新:

    您还没有真正明确您的用户表的结构,但我假设这些表的结构:

    create table Users (user varchar)
    create table tablea (groupname varchar)
    create table tableb (groupname varchar, groupcount int)
    

    因此这个查询:

    SELECT 
      u.user,
      a.groupname, 
      SUM(b.groupcount) as sumof
    FROM 
      TableB b 
      RIGHT JOIN
      (
        SELECT * FROM
        TableA a
        CROSS APPLY
        users u
      ) a
      ON 
        b.groupname = a.groupname
    GROUP BY
      u.username, a.groupname;
    

    如果您的 users 表和 tableA 相关,请说明如何。最好还是发布您的表格结构。如果不出意外,请在 SQL Server Management Studio 中执行以下操作并发布屏幕截图:

    SELECT * FROM users
    SELECT * FROM tableA
    SELECT * FROM tableB
    

    如果数据是机密的,去 SQLFiddle.com 做一个有代表性的例子,然后在这里发布它的 URL

    更新2:

    您创建的架构与您发布的示例查询不匹配的小问题,但还有一个更大的问题:您发布的架构意味着用户和组除了通过产品表之外没有任何关联。除了在 CROSS JOIN 中混合所有用户和组然后链接产品之外,没有什么可以为您提供对用户和组有价值的行。您也没有在小提琴中放置任何示例数据。你做了文本到 DDL 吗?它非常整洁:

    SELECT 
      u.user_name,
      g.group_id,
      SUM(p.product_id) --you don't want to sum the id, but your schema doesnt have anything else!
    FROM
      users u
      CROSS JOIN
      mygroup g
    
      LEFT JOIN
      products p
      ON
        u.user_id = p.user_id AND
        g.group_id = p.group_id
    
    GROUP BY
      u.user_name,
      p.product_id
    

    【讨论】:

    • 谢谢,我已经创建了一个模式和我当前的 sql 查询。请。查看 update_2
    • @MarkusSchnee 情况越来越糟了! :o :)
    • 显然我不能总结 id ;) 但对我来说真正重要的信息是,当前模式无法提供结果,我需要什么?我应该如何改变我的shema?
    • 老实说,我不太确定,因为事物的命名并不能真正让我了解您对数据建模的想法。在我看来,用户和产品都可以分组。显然,这里分组的不是用户,而是产品,但是您的查询说您想要产品为空的所有用户和组的列表。现在,虽然一个产品有一个用户和一个组,但用户和组之间没有关系,那么为什么我们需要一个必须发明用户组配对才能发现没有产品有用户组的查询?
    猜你喜欢
    • 2014-02-24
    • 1970-01-01
    • 2010-10-15
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多