【问题标题】:Wrong subquery in my SQL query我的 SQL 查询中的子查询错误
【发布时间】:2016-03-17 23:16:28
【问题描述】:

https://screenshot.googleplex.com/j4igYFL9sjH 在所有具有最低 RAM 容量的 PC 中,查找同时生产具有最低 RAM 容量和最高处理器速度的 PC 的打印机制造商。 结果集:制造商。

我的查询:

SELECT maker FROM Product WHERE type ='Printer' AND model IN(SELECT DISTINCT(model), hd, ram FROM PC 
                        WHERE hd = (
                                SELECT MAX(hd) FROM PC 
                                     WHERE model IN(SELECT DISTINCT(model) FROM PC
                                                                       WHERE ram <=(SELECT MIN(ram) FROM PC))));

原来这里没有制造商列表。我认为子查询有问题。

【问题讨论】:

  • 请提供示例数据和预期结果...您不可能需要所有这些子查询...另外,您使用的是哪个数据库——这可能会影响答案。
  • 这里:WHERE type ='Printer' AND model你需要找到制造商,而不是型号,所以应该是:WHERE type ='Printer' AND maker IN...
  • re: ..在所有具有最低 RAM 容量的 PC 中生产具有最低 RAM 容量和最高处理器速度的 PC ???不是很清楚先来的..

标签: sql subquery logic


【解决方案1】:

我真的不喜欢这个问题,因为它的措辞很含糊。希望这可以避免其他人为我刚刚弄清楚所问的内容而感到头疼:

SELECT DISTINCT maker FROM Product WHERE type = 'printer' AND maker IN 
  ( SELECT maker FROM Product WHERE model IN ( 
       SELECT model FROM Pc 
          WHERE ram = (SELECT MIN(ram) FROM PC)   
          AND speed = (SELECT MAX( speed) FROM 
             (SELECT speed FROM Pc WHERE 
                 ram = (SELECT MIN(ram) FROM Pc)) as z4) 
             )
  )

【讨论】:

    【解决方案2】:

    问题

    1. 不能保证具有给定类别的 PC maker 也会生产打印机。当前查询不会预料到这一点,因此它可能会返回注意

    2. 当前子查询不足以解决该问题,整个查询不起作用,因为子查询返回model 的 PC 具有最小 RAM、最大处理器、最大硬盘等等,然后是那个模型与product..中的所有打印机的model相比,它永远不会找到任何匹配..

    解决方案

    1. 翻转查询使主查询变为子查询,反之亦然,因此子查询是关于获取所有打印机maker
    2. 一旦翻转,获得任何条件的PC打印机maker都很容易,只需使用order by..

    守则

    下面的代码返回一台打印机maker,它也使PC 具有最大的hd 和最小的ram

    SELECT maker FROM product A INNER JOIN PC B ON A.model = B.model 
    WHERE maker IN (SELECT DISTINCT maker FROM product WHERE type = 'printer')
    ORDER BY hd DESC, ram ASC
    LIMIT 1
    

    【讨论】:

      【解决方案3】:

      这是我的回答,希望对你有帮助

      SELECT distinct maker FROM product WHERE type = 'printer'
      AND maker IN (SELECT maker
      FROM product JOIN ( 
      SELECT model, speed, ram FROM pc WHERE speed =
                      (SELECT MAX(speed) FROM pc
                      WHERE ram = (SELECT MIN(ram) FROM pc)
                      ) 
                  AND ram = (SELECT MIN(ram) FROM pc)
                  ) b
      ON product.model = b.model)
      

      通过使用:

      SELECT model, speed, ram FROM pc WHERE speed = 
      (SELECT MAX(speed) FROM pc 
      WHERE ram = (SELECT MIN(ram) FROM pc)) 
      

      你确定它会以 100 的速度返回任何东西。 假设您有模型 1、2、3,它们的速度都是 100,但它们的 ram 不同,它将返回所有三个模型,而实际上只有模型 1 具有最低的 ram。所以你想添加

      AND ram = (SELECT MIN(ram) FROM pc)
      

      作为附加条件,以确保您在使用 pc 标准取模型时对 ram 的要求不会消失。

      【讨论】:

      • 我认为这个问题真的很棘手,因为真正阅读了这个问题:“生产具有最低 RAM 容量和最高处理器速度的 PC”我明白要获得所有 PC 中 RAM 最低的同时最高处理器可以被声明为:where ram = (select min(ram) from pc) and speed = (select max(speed) from pc),然后不会检索结果。
      【解决方案4】:
      select distinct maker
      from product
      where 
       model in (
      select model 
      from  (select * from pc where ram in (select min (ram) from pc)) as A
      where speed in 
      
      (select max(speed) from
                (select * from pc  where ram in (select min(ram) from pc ))      as B)
      )
      and maker in (select maker  from product where type like 'printer')
      

      【讨论】:

        【解决方案5】:

        我使用了分而治之的方法

        WITH pc_lowest_ram as (
          SELECT DISTINCT model, pc.ram FROM pc
          WHERE pc.ram = (
           SELECT MIN(ram) FROM PC
          )
        ),
        printer_makers AS (
          SELECT DISTINCT maker FROM product p
          WHERE p.type = 'Printer'
        ),
        pc_max_speed AS (
          SELECT MAX(speed) pm FROM pc
          JOIN pc_lowest_ram plr on (plr.model = pc.model)
          WHERE plr.ram = pc.ram
        ),
        pc_models AS (
          SELECT pc.model pm FROM pc
          JOIN pc_lowest_ram plr on (plr.model = pc.model)
          WHERE plr.ram = pc.ram
          AND pc.speed = (
            SELECT pm FROM pc_max_speed
          )
        )
        SELECT DISTINCT p.maker FROM product p
        JOIN printer_makers ON (printer_makers.maker = p.maker)
        JOIN pc_models ON (pc_models.pm = p.model)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-02
          • 2022-12-11
          相关资源
          最近更新 更多