【问题标题】:counting number of cars that each owner has计算每个车主拥有的汽车数量
【发布时间】:2020-03-02 20:52:05
【问题描述】:

我正在尝试学习 plsql,但在理解一些基本知识时遇到了困难。这是我试图解决的一个挑战。 我有两张桌子。一个保存有关车主的信息,另一个保存有关汽车的信息。我想编写一个 anonymous 块来连接这两个表,并使用基于每个所有者注册的汽车数量的 for 循环打印每个人拥有的汽车数量。此外,我想要一个区分 1 Car(单数)和 2, 3 Cars(复数)的 if 语句。

表格如下:

CREATE TABLE owners(
id_nr VARCHAR2(13) PRIMARY KEY,
f_name VARCHAR2(20),
s_name VARCHAR2(20));

CREATE TABLE cars(
reg_nr VARCHAR2(6) PRIMARY KEY,
id_nr REFERENCES owners(pnr),
model VARCHAR2(20),
year NUMBER(4),
date DATE);

结果可能如下所示:

19380321-7799,Hans,Anderson,拥有:1 辆车

19490321-7899,Mike,Erikson,拥有:2 辆车

。 . . 等等

我尝试了许多不同的方法,但每次都会遇到一些错误。 我将不胜感激任何有助于我理解它的帮助和提示。

谢谢!

【问题讨论】:

  • 为什么不简单地使用带有GROUP BY 的单个 SQL 语句,这种方式比任何游标方法都更高效和可扩展。
  • 循环应该永远是绝对的最后手段。 99% 的时间它们可以用简单的 jane sql 来解决(而且应该是)。
  • 感谢您的回复。我同意使用 sql 更容易,并且可以在没有循环的情况下解决。但这是一个学习练习,我想知道如何在 plsql 中使用循环来完成。谢谢!
  • 了解 PL/SQL 最重要的一点是,什么时候使用它有意义,什么时候不使用它。提示:这是没有意义的情况。
  • 请在问题中展示并解释您尝试过的事情。请参阅 How to Ask、其他 help center 链接和投票箭头鼠标悬停文本。另外:当你得到一个你不期望/不理解的结果时,停止试图找到你的总体目标并找出你的误解是什么。--隔离第一个意外/误解的子表达式及其输入和输出并了解什么误解,错字,错误的推理等导致了它。 (调试基础。)询问一下。 minimal reproducible example

标签: oracle loops if-statement join plsql


【解决方案1】:

嗯,这是一种方法。如果你想练习循环,你可以在里面添加第二个循环来循环汽车表并打印每个车主拥有的所有汽车。

declare
    v_suffix varchar2(1);
begin
    for o in (select owners.id_nr, f_name, s_name,
                (select count(1) from cars where cars.id_nr = owners.id_nr) as num_cars
                from owners)
    loop
        if o.num_cars = 1 
            then v_suffix = null -- singular
            else v_suffix = 's' -- plural
        end if;
        dbms_output.put_line(o.id_nr || ', ' || o.f_name || ', ' || o.s_name
            || ' Owns: ' || o.num_cars || ' car' || v_suffix);
    end loop;
end;
/

【讨论】:

  • 非常感谢。现在我懂了。我尝试了几乎相同的方法,但我没有声明 v_suffix。这就是为什么它不起作用。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2018-10-13
相关资源
最近更新 更多