【问题标题】:How to make SQL query return exact number of rows如何使 SQL 查询返回准确的行数
【发布时间】:2013-12-20 13:21:51
【问题描述】:

假设有一个表,其中员工 A 有 3 行,员工 B 有 2 行。我需要编写一个查询,该查询将为两个员工都返回 3 行(即员工 B 应该存在一个虚拟行)

【问题讨论】:

  • 为什么你认为你需要一个存储过程?
  • 我正在尝试编写查询。
  • 您只需要一个查询或整个过程来处理这种情况吗?比如说,在要显示的所有项目中找到具有最大行数的项目/员工,并且对于任何行数少于该行数的项目,显示虚拟行?
  • PL/SQL 仅适用于存储过程。查询使用“仅”SQL。
  • 3 是所需的最大行数。有些员工可以有 3 行,有些可以有 2 行,有些可以有 1 行,依此类推。但任何员工的行数都不会超过 3 行。

标签: sql oracle


【解决方案1】:

您的问题对我来说并不完全清楚(例如,“3 行”也可以是“8 行”),但是一些起点:

设置

create table emprec
( emp_id number
, val    number
)

insert into emprec values ( 1, 15)

insert into emprec values ( 1, 16)

insert into emprec values ( 1, 17)

insert into emprec values ( 2, 18)

insert into emprec values ( 2, 19)

查询

select driving_x_axis.counter
,      driving_y_axis.emp_id
,      emprec.val
from  ( select  level counter
        from    dual
        connect by level <= 3
      ) driving_x_axis
join  ( select distinct emp_id
        from   emprec
      ) driving_y_axis
on    1=1 /* Carthesian. */
left
outer
join  ( select emp_id
        ,      val
        ,      row_number() over (partition by emp_id order by val) rownumber
        from   emprec
      ) emprec
on    emprec.rownumber = driving_x_axis.counter
and   emprec.emp_id    = driving_y_axis.emp_id

结果

1   1   15
2   1   16
3   1   17
1   2   18
2   2   19
3   2   <null>

可能有更简单的替代方案;请详细说明您的问题。

【讨论】:

  • 对于 Carthesian 连接,您也可以使用 table1 CROSS JOIN table2
  • 正确地,“交叉连接”是“1=1 连接”的一个很好的替代方案。
  • 嗨@Nitish 这个答案对解决您的问题有帮助吗?如果不是,请在您的问题中添加不成功的内容。当答案对您有帮助时,您是否可以通过单击旁边的空心绿色复选标记来接受它?
猜你喜欢
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多