Поиск пар моделей ПК - PullRequest
3 голосов
/ 19 мая 2011

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

Вот схема

PC

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) в моем выводе?

Спасибо.

Ответы [ 6 ]

5 голосов
/ 19 мая 2011

Разница между вашим выводом и требуемым выводом - это ровно те строки, которые имеют 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
4 голосов
/ 19 мая 2011

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

2 голосов
/ 01 августа 2015
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

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

2 голосов
/ 18 февраля 2014

ВЫБЕРИТЕ различные als1.model, als2.model, als1.speed, als1.ram ИЗ ПК als1, ПК als2 ГДЕ (als1.speed = als2.speed) И (als1.ram = als2.ram) И (als1. модель> als2.model)

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

1 голос
/ 30 августа 2015

Приведенный ниже код работает хорошо, так как нам нужно дважды вернуть столбец модели и получить данные скорости и оперативной памяти и убедиться, что мы ограничиваем данные модели, чтобы они не повторялись, нам нужно добавить условие 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
1 голос
/ 09 августа 2014
     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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...