Поиск пар моделей ПК

#sql #sql-server-2005

#sql #sql-server-2005

Вопрос:

Я пытаюсь решить упражнение по sql.

Вот схема

ПК

 code     int  
model    varchar(50)  
speed    smallint  
ram      smallint  
hd       real  
cd       varchar(10)  
price    money  
  

Проблема :

Найдите пары моделей ПК с одинаковыми скоростями и оперативной памятью. В результате каждая результирующая пара отображается только один раз, т.е. (i, j), но не (j, i).

Я написал запрос, но он отображает (i, j) вместе с (j, i).

Мой запрос :

 select  t1.model,t2.model,t1.speed,t1.ram from pc t1 , pc t2
where t1.speed = t2.speed and t1.ram = t2.ram and t1.model != t2.model
  

Вывод :

 model   model   speed   ram
1121    1233    750     128
1232    1233    500     64
1232    1260    500     32
1233    1121    750     128
1233    1232    500     64
1260    1232    500     32
  

Требуемый вывод:

 model   model   speed   ram
1233    1121    750     128
1233    1232    500     64
1260    1232    500     32
  

Итак, как мне избежать (j, i) в моем выводе?

Спасибо.

Комментарии:

1. Я поддерживаю как aix, так и ishtar, но я бы выбрал ishtar; Измените != на > .

Ответ №1:

Разница между вашим выводом и требуемым выводом заключается именно в тех строках, которые имеют t1.model < t2.model . Чтобы удалить их, просто добавьте другую AND t1.model >= t2.model . Но поскольку вам это уже требуется t1.model != t2.model , полный запрос

 select  t1.model,t2.model,t1.speed,t1.ram 
from pc t1 , pc t2 
where t1.speed = t2.speed and t1.ram = t2.ram and t1.model > t2.model
  

Ответ №2:

Предполагая, что code является уникальным, вы могли бы ограничить пары теми, где t1.code < t2.code .

Ответ №3:

ВЫБЕРИТЕ отдельные als1.model, als2.model, als1.speed, als1.ram С ПК als1, ПК als2, ГДЕ (als1.speed=als2.speed) И (als1.ram=als2.ram) И (als1.model> als2.model)

Это решит вашу проблему с получением (j, i). Необходим фильтр, чтобы избежать двойного результата, и поэтому, используя последний фильтр (als1.model> als2.model), вы можете выбрать, нужен ли вам (i, j) или (j,i).

Ответ №4:

 SELECT DISTINCT t.model, l.model, t.speed, t.ram
FROM PC as t JOIN PC as l
ON t.speed = l.speed AND t.ram = l.ram
AND t.model>l.model
  

Это должно привести к правильному решению для текущей и вторичной базы данных

Ответ №5:

      select pc1.model,pc2.model,pc1.speed,pc1.ram
     from pc pc1,pc pc2
     where pc1.speed=pc2.speed and pc1.ram= pc2.ram 
     group by pc1.model, pc2.model, pc1.speed, pc1.ram
     having pc1.model> pc2.model
  

Ответ №6:

Приведенный ниже код работает хорошо, поскольку нам нужно дважды вернуть столбец модели и получить данные о скорости и оперативной памяти, а также убедиться, что мы ограничиваем повторение данных модели, нам нужно добавить условие t1.model > t2.model :

 SELECT t1.model,
       t2.model,
       t1.speed,
       t1.ram
FROM pc t1,
     pc t2
WHERE t1.speed = t2.speed
  AND t1.ram= t2.ram
GROUP BY t1.model,
         t2.model,
         t1.speed,
         t1.ram
HAVING t1.model > t2.model