【问题标题】:Write a Procedure, cursor to display cars编写程序,光标显示汽车
【发布时间】:2021-09-09 07:25:59
【问题描述】:

我有这些表:

  • 汽车(CarID、品牌、Buyprice、YearManufacture、颜色)
  • 客户(ClientId、姓名、地址、薪水)
  • 供应商(供应商 ID、名称)
  • 销售(CarID、ClientID、VendorID、SaleDate、SalePrice)

我必须编写一个显示所有汽车的程序。如果汽车是“Mercedes”类型,请显示其购买价格以及是否已售出。

这是我的代码:

CREATE PROCEDURE PD
AS
BEGIN
    DECLARE Crs CURSOR FOR 
         SELECT CarID, brand, Buyprice 
         FROM Car;

    DECLARE @Carid INT;
    DECLARE @Type varchar (100);
    DECLARE @Price INT;
    DECLARE @N INT;

    OPEN Crs;

    FETCH Crs INTO @Carid, @Type, @Price;

    WHILE @@Fetch_status = 0
        IF @Type = 'MERCEDES' 
        BEGIN
            PRINT @Price;

            SELECT @N = COUNT(*)
            FROM Sale
            WHERE CarID = @Carid;

            IF @N > 0  
            BEGIN
                PRINT 'Car already sold');
            ELSE
                PRINT 'Car is sold');
            END
        END 
    END;

    CLOSE Crs;
    DEALLOCATE Crs;

END;

是正确的,还是我遗漏了什么?

【问题讨论】:

  • 您需要为所有declare指定数据类型。示例DECLARE @Carid INT
  • 啊,是的,我忘记了
  • 不要使用SELECT * FROM,明确指定你需要的列,这样更不容易出错。就像在您的查询中一样,您有 SELECT * FROM CAR,它将返回 CAR 表中的所有 5 列。但是您在 FETCH Crs INTO 中只指定了 3 个变量
  • 我应该添加更多变量还是只选择 3 个属性 ID、品牌、价格,因为他说显示所有汽车可能意味着 *
  • 您应该将select * 更改为select CarID, brand, Buyprice。明确指定您需要的列总是比使用 * 更好。所以不要添加更多你没有使用的变量。您的存储过程中还有一些语法错误,我建议您掌握一个 SQL Server,在那里输入查询并尝试执行它

标签: sql sql-server database stored-procedures cursor


【解决方案1】:

我完全不明白您为什么要在此处使用光标,这应该只是一个连接查询。

当光标是正确答案时,几乎没有任何情况。它们速度慢且效率低,并且仅在非常特定的情况下有用,例如基于系统表执行 DDL。

您想要这样的联合查询

SELECT
   c.CarID,
   c.Brand,
   c.Buyprice,
   NumOfSales = COUNT(s.CarId)
FROM Car c
LEFT JOIN Sale s ON s.CarId = c.CarId
WHERE c.Brand = 'MERCEDES'
GROUP BY
   c.CarID,
   c.Brand,
   c.Buyprice;

注意LEFT JOIN 而不是INNER JOIN,即使Sale 中没有结果,它也会从Car 获取结果。

【讨论】:

    猜你喜欢
    • 2020-08-25
    • 1970-01-01
    • 2021-07-21
    • 2020-08-24
    • 1970-01-01
    • 2019-10-31
    • 2018-08-26
    • 2021-08-20
    • 2023-01-14
    相关资源
    最近更新 更多