Удалите со стола ПК компьютеры с минимальным размером жесткого диска или минимальным размером оперативной памяти. - PullRequest
0 голосов
/ 27 ноября 2018

ПК (код, модель, скорость, оперативная память, HD, CD, цена)

Я пишу запрос

delete from PC  
where exists
(select model , min(hd), min(ram) from PC
group by model)

, но не получаю правильный результат

Ожидаемый результат:

 code   model   speed   ram hd  cd  price
    2   1121    750 128 14.0    40x 850.0000
    4   1121    600 128 14.0    40x 850.0000
    5   1121    600 128 8.0 40x 850.0000
    6   1233    750 128 20.0    50x 950.0000
    8   1232    450 64  8.0 24x 350.0000
    11  1233    900 128 40.0    40x 980.0000

Может ли кто-нибудь исправить меня в моем запросе?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Вы хотите предложение корреляции.В противном случае вы удаляете либо все строки (если подзапрос возвращает какие-либо строки), либо не строки (если подзапрос не возвращает строк).

Что вас смущает, так это group by.Вы хотите вместо этого предложение о корреляции.Я бы написал это как два разных сравнения:

delete from PC  
where hd = (select min(hd)
            from PC pc2
            where pc2.model = pc.model
           ) or
      ram = (select min(ram) 
             from PC pc2
             where pc2.model = pc.model
            );
0 голосов
/ 27 ноября 2018

Ваш EXISTS просто удалит все из таблицы, где условие EXISTS выполняется.Вы можете узнать больше здесь .

Вам нужно удалить только те записи, которые вы ищете, что указывает на оконную функцию.Вы можете узнать больше информации здесь .

Если вы просто пытаетесь удалить запись с самыми низкими значениями hd и ram, то нижеприведенное поможет вам на вашем пути.Остерегайтесь ниже будет порядок сначала HD, а затем оперативной памяти.Таким образом, запись с наименьшим значением hd всегда будет удалена первой.

BEGIN TRAN;
DELETE p FROM PC p
INNER JOIN
(
SELECT Code,
ROW_NUMBER() OVER (PARTITION BY model ORDER BY hd DESC, ram DESC) [RNum]
) m ON m.Code = p.Code AND m.RNum = 1;
--COMMIT TRAN;
--ROLLBACK TRAN;
...