Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缺少组的SQL pad查询结果_Sql_Oracle_Oracle11g - Fatal编程技术网

缺少组的SQL pad查询结果

缺少组的SQL pad查询结果,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,假设下表: 表a: ID GroupName SomeValue 1 C 1 2 C 1 2 B 1 2 A 1 我需要构造一个选择以下结果的查询: ID GroupName SomeValue 1 C 1 1 B 0 1 A 0 2 C 1 2 B 1 2 A 1 GroupName实际上

假设下表:

表a:

ID  GroupName SomeValue
1   C         1
2   C         1
2   B         1
2   A         1
我需要构造一个选择以下结果的查询:

ID  GroupName SomeValue
1   C         1
1   B         0
1   A         0
2   C         1
2   B         1
2   A         1
GroupName实际上是从TableA列的大小写表达式派生的,只能接受3个值:A、B、C

解析函数是我们要走的路吗

编辑

很抱歉,没有提及它,但是ID可以由多个列组成。考虑这个例子:

ID1 ID2 GroupName SomeValue
1   1   C         1

1   2   C         1

2   2   C         1
2   2   B         1
2   2   A         1
对于每个唯一的组合ID1+ID2,我需要用0填充一些值。所以结果应该是这样的:

ID1 ID2 GroupName SomeValue

1   1   C         1
1   1   B         0
1   1   A         0

1   2   C         1
1   2   B         0
1   2   A         0

2   2   C         1
2   2   B         1
2   2   A         1  
编辑2
看起来像是@Laurence提出的解决方案,即使对多个列“ID”也应该有效。我无法重写@Nicholas Krasnov提出的查询以符合此要求。但有人能从性能角度比较这些解决方案吗?分析函数是否比“交叉连接+左外部连接”工作得更快?

为了填补空白,您可以使用外部连接的partition by子句编写类似的查询:

SQL> with t1(ID,GroupName,SomeValue) as
  2  (
  3    select 1,   'C',   1  from dual union all
  4    select 2,   'C',   1  from dual union all
  5    select 2,   'B',   1  from dual union all
  6    select 2,   'A',   1  from dual
  7  ),
  8  groups(group_name) as(
  9    select 'A' from dual union all
 10    select 'B' from dual union all
 11    select 'C' from dual
 12  )
 13  select t1.ID
 14       , g.group_name
 15       , nvl(SomeValue, 0) SomeValue
 16    from t1
 17    partition by (t1.Id)
 18    right outer join groups g
 19       on (t1.GroupName = g.group_name)
 20    order by t1.ID asc, g.group_name desc
 21  ;

        ID GROUP_NAME  SOMEVALUE
---------- ---------- ----------
         1 C                   1
         1 B                   0
         1 A                   0
         2 C                   1
         2 B                   1
         2 A                   1

6 rows selected
更新:对评论的回应

在partition by子句中也指定ID2列:

SQL> with t1(ID1, ID2, GroupName,SomeValue) as
  2  (
  3    select 1, 1, 'C', 1 from dual union all
  4    select 1, 2, 'C', 1 from dual union all
  5    select 2, 2, 'C', 1  from dual union all
  6    select 2, 2, 'B', 1  from dual union all
  7    select 2, 2, 'A', 1  from dual
  8  ),
  9  groups(group_name) as(
 10    select 'A' from dual union all
 11    select 'B' from dual union all
 12    select 'C' from dual
 13  )
 14  select t1.ID1
 15       , t1.ID2
 16       , g.group_name
 17       , nvl(SomeValue, 0) SomeValue
 18    from t1
 19    partition by (t1.Id1, t1.Id2)
 20    right outer join groups g
 21    on (t1.GroupName = g.group_name)
 22  order by t1.ID1, t1.ID2  asc , g.group_name desc
 23  ;

       ID1        ID2 GROUP_NAME  SOMEVALUE
---------- ---------- ---------- ----------
         1          1 C                   1
         1          1 B                   0
         1          1 A                   0
         1          2 C                   1
         1          2 B                   0
         1          2 A                   0
         2          2 C                   1
         2          2 B                   1
         2          2 A                   1

9 rows selected

为了填补空白,您可以使用外部联接的partition by子句编写类似的查询:

SQL> with t1(ID,GroupName,SomeValue) as
  2  (
  3    select 1,   'C',   1  from dual union all
  4    select 2,   'C',   1  from dual union all
  5    select 2,   'B',   1  from dual union all
  6    select 2,   'A',   1  from dual
  7  ),
  8  groups(group_name) as(
  9    select 'A' from dual union all
 10    select 'B' from dual union all
 11    select 'C' from dual
 12  )
 13  select t1.ID
 14       , g.group_name
 15       , nvl(SomeValue, 0) SomeValue
 16    from t1
 17    partition by (t1.Id)
 18    right outer join groups g
 19       on (t1.GroupName = g.group_name)
 20    order by t1.ID asc, g.group_name desc
 21  ;

        ID GROUP_NAME  SOMEVALUE
---------- ---------- ----------
         1 C                   1
         1 B                   0
         1 A                   0
         2 C                   1
         2 B                   1
         2 A                   1

6 rows selected
更新:对评论的回应

在partition by子句中也指定ID2列:

SQL> with t1(ID1, ID2, GroupName,SomeValue) as
  2  (
  3    select 1, 1, 'C', 1 from dual union all
  4    select 1, 2, 'C', 1 from dual union all
  5    select 2, 2, 'C', 1  from dual union all
  6    select 2, 2, 'B', 1  from dual union all
  7    select 2, 2, 'A', 1  from dual
  8  ),
  9  groups(group_name) as(
 10    select 'A' from dual union all
 11    select 'B' from dual union all
 12    select 'C' from dual
 13  )
 14  select t1.ID1
 15       , t1.ID2
 16       , g.group_name
 17       , nvl(SomeValue, 0) SomeValue
 18    from t1
 19    partition by (t1.Id1, t1.Id2)
 20    right outer join groups g
 21    on (t1.GroupName = g.group_name)
 22  order by t1.ID1, t1.ID2  asc , g.group_name desc
 23  ;

       ID1        ID2 GROUP_NAME  SOMEVALUE
---------- ---------- ---------- ----------
         1          1 C                   1
         1          1 B                   0
         1          1 A                   0
         1          2 C                   1
         1          2 B                   0
         1          2 A                   0
         2          2 C                   1
         2          2 B                   1
         2          2 A                   1

9 rows selected

谢谢!你认为这应该比交叉连接+左外连接解决方案快吗?@jFrenetic是的,至少因为I/O的减少。你应该自己测试它。执行查询,查看解释计划。您应该始终自己测试它。我同意你的看法。只是我现在没有工作环境。我一定会尽快测试的。非常感谢!我希望这会比我的解决方案更快,因为它是专门为此设计的功能。如果你做了测试,知道就好了。@Laurence我会告诉你的。查询本身运行良好。我只是想知道,通过外部连接技巧,神奇的Oracle在这个分区背后做了什么:非常感谢!你认为这应该比交叉连接+左外连接解决方案快吗?@jFrenetic是的,至少因为I/O的减少。你应该自己测试它。执行查询,查看解释计划。您应该始终自己测试它。我同意你的看法。只是我现在没有工作环境。我一定会尽快测试的。非常感谢!我希望这会比我的解决方案更快,因为它是专门为此设计的功能。如果你做了测试,知道就好了。@Laurence我会告诉你的。查询本身运行良好。我只是想知道神奇的Oracle通过外部连接技巧在这个分区后面做了什么: