Как из столбца таблицы составить пары без одинаковых значений?
Используя данные из таблицы городов, составьте одним запросом всевозможные пары городов так, чтобы в результате не было пар с одинаковыми названиями городов. Для решения необходимо использовать декартово произведение.
select c.city as "Город" , c1.city as "Город 2" from city c cross join city c1 where c1.city_id > c.city_id |
select c.city as "Город" , c1.city as "Город 2" from city c cross join city c1 where c1.city_id > c.city_id
Я думал,что ответ верный,но прислали на пересдачу.
Дополнительно:
А почему именно больше то? Может стоит использовать !=
P.S. Ты ходил 4 раза?? И что? Фиксил по одной букве? Слушай как ты вообще сам себя проверяешь?
Мог бы уже установить себе dbms и воспроизвести все до получения результата!
1|New York 2|Moscow 3|London |
1|New York 2|Moscow 3|London
Всего 6 пар.
Должно получиться.как на фото, у меня так и получалось. Совсем себя глупым ощутил и решил посоветоваться с вами.
Выполните запрос:
select *
from city c
where c.city = 'London'
Получите два города с одинаковым названием, но разными id (312 и 313).
Сейчас Вы пишите условие, что where c1.city_id > c.city_id. Если изначально при Декартовом произведении Вы получите:
312 - 313
313 - 312
то после условия останется 313 - 312, то есть Лондон - Лондон, а в задании указано, что не должно быть пар с одинаковыми значениями, а они у Вас есть:
select c.city as "Город" , c1.city as "Город 2"
from city c
cross join city c1
where c1.city_id > c.city_id and c.city = 'London' and c1.city = 'London'
Таким образом условие по идентификаторам ложное.
where c1.city_id > c.city_id and c.city != c1.city
Но не уверен, что это где-то кроме postgres будет работать.
Ответы:
Ну совсем тупой вариант
select * from (select least(city.id, city2.id) as id1, greatest(city.id, city2.id) as id2 from city join city as city2 on city.id != city2.id group by least(city.id, city2.id), greatest(city.id, city2.id) ) as t join city as city1 on city1.id = id1 join city as city2 on city2.id = id2; |
select * from (select least(city.id, city2.id) as id1, greatest(city.id, city2.id) as id2 from city join city as city2 on city.id != city2.id group by least(city.id, city2.id), greatest(city.id, city2.id) ) as t join city as city1 on city1.id = id1 join city as city2 on city2.id = id2;
Если подумать то конечно можно проще
select LEAST(city.name, city1.name), GREATEST(city.name, city1.name) from city inner join city as city1 on city1.id != city.id GROUP BY LEAST(city.name, city1.name), GREATEST(city.name, city1.name); |
select LEAST(city.name, city1.name), GREATEST(city.name, city1.name) from city inner join city as city1 on city1.id != city.id GROUP BY LEAST(city.name, city1.name), GREATEST(city.name, city1.name);
- слишком сложно для моего уровня)
- slavagorschenin, какую тему изучали?
- slavagorschenin, и db то какое?
- Второй запрос правильный, но поскольку названия городов не уникальны:
inner join city as city1 on city1.name != city.name
inner join city as city1 on city1.name != city.name
С учётом неуникальности названия городов:
select DISTINCT c.city as "Город 1" , c1.city as "Город 2" from city c cross join city c1 where c1.city > c.city |
select DISTINCT c.city as "Город 1" , c1.city as "Город 2" from city c cross join city c1 where c1.city > c.city
я бы попробовал вариант с объединением четных и нечетных строк таблицы
- умножение? я тоже думал об этом,но не знаю,где можно умножить,спасибо за помощь.
- slavagorschenin, я не говорил про умножение,
имел ввиду что бы сначала выбирать четные строки, и объединять с этой же таблицей но выбирать нечетные строкиконечно надо не забыть про мелочи, типа одинаково отсортировать их и т.п.
Задача из Нетологии.
К сожалению, проверки ДЗ у меня нет, но я решил так:
select c.city as "Город 1", c2.city as "Город 2" from (select distinct city from city) c cross join (select distinct city from city) c2 where c.city <> c2.city order by "Город 1", "Город 2" |
select c.city as "Город 1", c2.city as "Город 2" from (select distinct city from city) c cross join (select distinct city from city) c2 where c.city <> c2.city order by "Город 1", "Город 2"
Доброго дня всем) у меня такой вариант:
select c.city, c2.city from city c, city c2 where c.city <> c2.city |
select c.city, c2.city from city c, city c2 where c.city <> c2.city
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос

Для составления пар без одинаковых значений из столбца таблицы, можно воспользоваться SQL запросом, который будет выбирать уникальные значения из столбца и формировать пары на их основе.
Пример SQL запроса для таблицы с названием "table_name" и столбцом "column_name":
SELECT t1.column_name AS value1, t2.column_name AS value2 FROM table_name t1 JOIN table_name t2 ON t1.column_name t2.column_name
В данном запросе используется оператор JOIN для объединения таблицы саму с собой, чтобы создать все возможные комбинации значений из столбца. Условие t1.column_name t2.column_name гарантирует, что значения в паре будут различными.
После выполнения данного запроса, вы получите все возможные уникальные пары значений из столбца таблицы. При необходимости, можно также добавить дополнительные условия или фильтры для дальнейшей обработки данных.
Надеюсь, данное объяснение поможет вам решить задачу по составлению пар без одинаковых значений из столбца таблицы. Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их.