#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