【问题标题】:SQL DML Exercise 10SQL DML 练习 10
【发布时间】:2014-03-24 08:14:01
【问题描述】:

我经常使用但从未注册过。我遇到了一个问题,我不知道如何获得正确的查询。所以首先,这个问题是参考 www.sql-ex.ru 及其 DML 部分中的练习 10。

这里是所有信息:

数据库方案由四个表组成:Product(maker, model, 类型)PC(代码,型号,速度,内存,高清,CD,价格)笔记本电脑(代码,型号, 速度,内存,高清,屏幕,价格)打印机(代码,型号,颜色,类型, 价格)表格“产品”包括有关制造商、型号的信息 编号和类型(“PC”、“笔记本电脑”或“打印机”)。假设 产品表中的型号对于所有制造商都是唯一的,并且 产品类型。每台 PC 由表“PC”中的代码唯一指定 以模型为特征(引用产品表的外键), 速度(以 MHz 为单位的处理器),RAM 总量 - ram(以 Mb 为单位), 硬盘驱动器容量 - hd(以 Gb 为单位),CD ROM 速度 - cd(例如, '4x')和价格。表“笔记本电脑”类似于 PC 之一 除了CD ROM速度,换成屏幕大小—— 屏幕(英寸)。对于“打印机”表中的每台打印机,都会被告知 打印机是否为彩色(颜色属性为“y”表示颜色 打印机;否则为“n”)、打印机类型(激光、喷射或矩阵), 和价格。

将 Product 表中的所有型号添加到 PC 表中 不在 PC 桌上。

连同上面插入的型号必须有规格:

  1. 代码应该等于型号加上插入操作前PC表中的最大代码值。

  2. 速度、RAM 和 HD 容量以及 CD 速度应该是 PC 表中所有可用对应值中的最大值。

  3. 价格应该是插入操作前PC表中所有PC的平均值。

这是我的查询:

INSERT INTO PC 
   SELECT 
      p.model + MAX(pc.code),
      p.model,
      MAX(pc.speed) speed, 
      MAX(pc.ram) ram, 
      MAX(pc.hd) hd, 
      MAX(pc.cd) cd,
      AVG(pc.price) price 
   FROM 
      product p, pc pc 
   WHERE 
      type= 'pc' 
   AND 
      p.model NOT IN (SELECT model from pc) 
   GROUP BY 
      p.model

现在我得到了正确的结果,但出现以下错误:

您的查询在主数据库上生成了正确的结果集,但它失败了 第二次测试,检查数据库。 * 数据不匹配(1)

他们的常见问题解答中的意思是:

如果答案在逻辑上是正确的,它总是被认为是正确的 回答。逻辑错误答案的可能性很小 被认为是对的。判断查询是否正确 2 使用具有相同结构和不同数据的数据库。如果 系统告诉你你的查询是错误的,但你可以看到匹配 结果,这意味着您的查询在第二次给出了错误的答案 数据库。而且仍然有可能在逻辑上不正确 查询将返回正确的结果集。这种可能性可以 通过准确的数据选择或使用两个以上的数据而减少 数据库来检查查询。第二种方式吸引力较小,因为它 将需要更多时间来响应用户。让我们注意,曾经 制定的查询应始终返回正确的结果,无论 当前数据库状态。如果你有理由怀疑 查询判断的正确性,请将您的代码发送至 系统的开发者。

任何帮助将不胜感激!

【问题讨论】:

  • 我看到您有一个 FROM 子句,其中包含两个表 product, pc 但没有条件加入它们。最好这将类似于FROM product p INNER JOIN pc ON p.some_common_column = pc.some_common_column 或使用您的隐式方法WHERE p.some_common_column = pc.some_common_column
  • 看描述,貌似model是普通列,所以FROM product p INNER JOIN pc ON p.model = pc.model
  • 我试过了,但现在它消除了需要正确的最后两行。
  • 您原来的p.model NOT IN (SELECT model from pc) 表明product 中有行在pc 中没有对应的行。 LEFT JOIN 应该涵盖该用例,而不是 INNER JOIN
  • 感谢您的帮助。我是一个完整的 SQL 新手,所以请耐心等待。我从来没有在这里发过帖子,所以它让我失望。 Left Join 为我提供了所有结果,但最后两个结果不存在,而且对于前两个结果,它们或其他一些结果似乎在整个表格中为空。

标签: sql dml


【解决方案1】:

问题是 cd 速度被视为字符串而不是数字。 例如,2x 大于 16x。您必须将 cd speed 设为一个数字。

但它的末端有“x”,你必须修剪它。然后你可以将它投射到 编号并正确运行 max() 函数。最后你必须投 它回到字符串并重新添加'x'到它的末尾。

这是工作代码

INSERT INTO PC SELECT p.model + MAX(pc.code) code, p.model, MAX(pc.speed) speed, MAX(pc.ram) ram,
MAX(pc.hd) hd, CAST(MAX(CAST(REPLACE(pc.cd,'x','')AS int))AS varchar)+'x' cd, AVG(pc.price) price FROM product p INNER JOIN pc ON p.type= 'pc' WHERE p.model NOT IN (SELECT model from pc) GROUP BY p.model

其实感谢您的代码 :) 我无法自己弄清楚。 一旦我复制了你的,我很快就发现了问题:)

【讨论】:

    猜你喜欢
    • 2015-08-18
    • 2014-11-01
    • 2015-07-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多