Как объединить 2 таблицы в SQL с одним общим столбцом и без связи в других столбцах? - PullRequest
3 голосов
/ 27 сентября 2019

Я пытаюсь объединить 2 таблицы с 2 столбцами в каждой:

  • одна с городами |Имена
  • один с городами |Улицы

Один столбец (Cities) в каждой таблице содержит аналогичную информацию, но другие столбцы (Names и Streets) независимы в каждой таблице.

Использованиеобщий столбец, я просто хочу объединить и перечислить все другие элементы в следующем столбце 2 в виде одной таблицы:

Cities | Names | Streets

Перечисление всех Names и Streets в исходных таблицах справильный City в первом столбце, без повторов Names или Streets (и добавление пробелов, если в определенном City.

Резюме большездесь:

https://docs.google.com/spreadsheets/d/e/2PACX-1vQxHJopVBcuUN9RK5fHs7qhVxdry4v3HB6Az3LrRWXJxspV4abTTFS2VQka87GG3s9DHlT6FKUKPWal/pubhtml

Я пробовал разные объединения, но затем я получаю все комбинации между Names и Streets, что не то, что я хочу.

Это не работает:

select *  
from city, street 
where city.city = street.city
order by city.name asc, street.name asc;

Пожалуйста, посмотрите GoogleSheet здесь: https://docs.google.com/spreadsheets/d/e/2PACX-1vQxHJopVBcuUN9RK5fHs7qhVxdry4v3HB6Az3LrRWXJxspV4abTTFS2VQka87GG3s9DHlT6FKUKPWal/pubhtml

Добавление кода для создания таблиц на тот случай, если кто-то захочет попробовать это:

CREATE TABLE names  
(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    city VARCHAR(30) NOT NULL, 
    name VARCHAR(30) NOT NULL
); 

CREATE TABLE streets 
(
    id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    city VARCHAR(30) NOT NULL, 
    street VARCHAR(30) NOT NULL
); 

INSERT INTO `names` (`id`, `city`, `name`) VALUES (1, 'paris', 'nameP1');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (2, 'paris', 'nameP2');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (3, 'paris', 'nameP3');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (4, 'paris', 'nameP4');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (5, 'paris', 'nameP5');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (6, 'tokyo', 'nameT1');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (7, 'tokyo', 'nameT2');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (8, 'tokyo', 'nameT3');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (9, 'tokyo', 'nameT4');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (10, 'tokyo', 'nameT5');
INSERT INTO `names` (`id`, `city`, `name`) VALUES (11, 'tokyo', 'nameT6');

INSERT INTO `streets` (`id`, `city`, `street`) VALUES (1, 'paris', 'streetP1');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (2, 'paris', 'streetP2');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (3, 'paris', 'streetP3');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (4, 'tokyo', 'streetT1');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (5, 'tokyo', 'streetT2');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (6, 'tokyo', 'streetT3');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (7, 'tokyo', 'streetT4');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (8, 'tokyo', 'streetT5');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (9, 'tokyo', 'streetT6');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (10, 'tokyo', 'streetT7');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (11, 'tokyo', 'streetT8');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (12, 'tokyo', 'streetT9');
INSERT INTO `streets` (`id`, `city`, `street`) VALUES (13, 'tokyo', 'streetT10');

Добавление сюда моих таблиц и ожидаемых результатов:

Таблица Имена :

+---—+-------+--------+
| id |  City |  Names | 
+---—+-------+--------+
|  1 | paris | nameP1 |
|  2 | paris | nameP2 |
|  3 | paris | nameP3 |
|  4 | paris | nameP4 |
|  5 | paris | nameP5 |
|  6 | tokyo | nameT1 |
|  7 | tokyo | nameT2 |
|  8 | tokyo | nameT3 |
|  9 | tokyo | nameT4 |
| 10 | tokyo | nameT5 |
| 11 | tokyo | nameT6 |
+---—+-------+--------+

Таблица улицы :

+----+-------+-----------+
| id |  City |   Streets | 
+----+-------+-----------+
|  1 | paris |  streetP1 |
|  2 | paris |  streetP2 |
|  3 | paris |  streetP3 |
|  4 | tokyo |  streetT1 |
|  5 | tokyo |  streetT2 |
|  6 | tokyo |  streetT3 |
|  7 | tokyo |  streetT4 |
|  8 | tokyo |  streetT5 |
|  9 | tokyo |  streetT6 |
| 10 | tokyo |  streetT7 |
| 11 | tokyo |  streetT8 |
| 12 | tokyo |  streetT9 |
| 13 | tokyo | streetT10 |
+----+-------+-----------+

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

+-------+---------+-----------+
| City  | Names   | Streets   |
+-------+---------+-----------+
| paris |  nameP1 |  streetP1 |
| paris |  nameP2 |  streetP2 |
| paris |  nameP3 |  streetP3 |
| paris |  nameP4 |           |
| paris |  nameP5 |           |
| tokyo |  nameT1 |  streetT1 |
| tokyo |  nameT2 |  streetT2 |
| tokyo |  nameT3 |  streetT3 |
| tokyo |  nameT4 |  streetT4 |
| tokyo |  nameT5 |  streetT5 |
| tokyo |  nameT6 |  streetT6 |
| tokyo |         |  streetT7 |
| tokyo |         |  streetT8 |
| tokyo |         |  streetT9 |
| tokyo |         | streetT10 |
+-------+---------+-----------+

Обратите внимание:

  • Таблица 'списки имен 5 имен в Париже, 6 имен в Токио
  • Таблица «улиц» списков 3 улицы в Париже, 10 улиц в Токио
  • В результатах должен быть указан 2 города в столбце 1 с5 названий и 3 улицы в Париже в следующих 2 колонках рядом с Парижем, а затем 6 названий и 10 улиц в Токио рядом с Токио
  • нет никакой связи между названиями и улицами, за исключением того, что они находятся вв том же городе
  • в Париже больше названий, чем улиц, в Токио больше улиц, поэтому некоторые значения оставлены пустыми, чтобы учесть это

В ответ на ответ Гордона ниже:почти там, но не на 100%, так как я хочу, чтобы городские ссоры были вместе.Если у меня больше улиц, то это не совсем так - см .:

Если я начну с:

CREATE TABLE names (id INT (6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, город VARCHAR (30) NOT NULL, имя VARCHAR (30) NOT NULL);

CREATE TABLE street (id INT (6) UNSIGNED AUTO_INCREMENT ПЕРВИЧНЫЙ КЛЮЧ, город VARCHAR (30) NOT NULL, улица VARCHAR (30) NOT NULL);

INSERT INTO names (id, city, name) VALUES (1, 'paris', 'nameP1');INSERT INTO names (id, city, name) VALUES (2, 'paris', 'nameP2');INSERT INTO names (id, city, name) VALUES (3, 'paris', 'nameP3');INSERT INTO names (id, city, name) VALUES (4, 'paris', 'nameP4');INSERT INTO names (id, city, name) VALUES (5, 'paris', 'nameP5');INSERT INTO names (id, city, name) VALUES (6, 'токио', 'nameT1');INSERT INTO names (id, city, name) VALUES (7, 'токио', 'nameT2');INSERT INTO names (id, city, name) VALUES (8, 'tokyo', 'nameT3');INSERT INTO names (id, city, name) VALUES (9, 'токио', 'nameT4');INSERT INTO names (id, city, name) VALUES (10, 'токио', 'nameT5');INSERT INTO names (id, city, name) VALUES (11, 'tokyo', 'nameT6');

INSERT INTO streets (id, city, street) ЗНАЧЕНИЯ (1, 'paris', 'streetP1');INSERT INTO streets (id, city, street) VALUES (2, 'paris', 'streetP2');INSERT INTO streets (id, city, street) VALUES (3, 'paris', 'streetP3');INSERT INTO streets (id, city, street) VALUES (3, 'paris', 'streetP4');INSERT INTO streets (id, city, street) VALUES (3, 'paris', 'streetP5');INSERT INTO streets (id, city, street) VALUES (3, 'paris', 'streetP6');INSERT INTO streets (id, city, street) VALUES (3, 'paris', 'streetP7');INSERT INTO streets (id, city, street) VALUES (4, «Токио», «Улица T1»);INSERT INTO streets (id, city, street) VALUES (5, «Токио», «Улица T2»);ВСТАВИТЬ INTO streets (id, city, street) ЗНАЧЕНИЯ (6, «Токио», «Улица T3»);INSERT INTO streets (id, city, street) VALUES (7, «Токио», «Улица T4»);INSERT INTO streets (id, city, street) VALUES (8, «Токио», «Улица T5»);INSERT INTO streets (id, city, street) ЗНАЧЕНИЯ (9, «Токио», «Улица T6»);INSERT INTO streets (id, city, street) VALUES (10, «Токио», «Улица T7»);INSERT INTO streets (id, city, street) ЗНАЧЕНИЯ (11, «Токио», «Улица T8»);INSERT INTO streets (id, city, street) ЗНАЧЕНИЯ (12, «Токио», «Улица T9»);INSERT INTO streets (id, city, street) VALUES (13, 'tokyo', 'streetT10');

Я создаю эти 2 таблицы:

Имена ТАБЛИЦЫ + ——— + ——-——-— + —-—-———— + |id |Город |Имена |+ ——— + ————-—-— + ———-———— + |1 |Париж |nameP1 ||2 |Париж |nameP2 ||3 |Париж |nameP3 ||4 |Париж |nameP4 ||5 |Париж |nameP5 ||6 |Токио |nameT1 ||7 |Токио |nameT2 ||8 |Токио |nameT3 ||9 |Токио |nameT4 ||10 |Токио |nameT5 ||11 |Токио |nameT6 |+ ——— + ————-—-— + ———-———— +

СТОЛОВЫЕ улицы + ——-— + ——-——-— + —————-—-——— + |id |Город |Улицы |+ ——-— + —————-— + —————-————— + |1 |Париж |улицаP1 ||2 |Париж |улицаP2 ||3 |Париж |улицаP3 ||4 |Париж |улицаP4 ||5 |Париж |улицаP5 ||6 |Париж |улицаP6 ||7 |Париж |улицаP7 ||8 |Токио |streetT1 ||9 |Токио |streetT2 ||10 |Токио |streetT3 ||11 |Токио |streetT4 ||12 |Токио |streetT5 ||13 |Токио |streetT6 ||14 |Токио |streetT7 ||15 |Токио |streetT8 ||16 |Токио |streetT9 ||17 |Токио |streetT10 |+ ——— + ————-—-— + ———-———-——— +

Я хочу получить:

+ ——-——-- + —————-——— + ———-——-——-— + |Город |Имена |Улицы |+ —————-— + —————-——— + ————-————- + |Париж |nameP1 |улицаP1 ||Париж |nameP2 |улицаP2 ||Париж |nameP3 |улицаP3 ||Париж |nameP4 |улицаP4 ||Париж |nameP5 |улицаP5 ||Париж ||улицаP6 ||Париж ||улицаP7 ||Токио |nameT1 |streetT1 ||Токио |nameT2 |streetT2 ||Токио |nameT3 |streetT3 ||Токио |nameT4 |streetT4 ||Токио |nameT5 |streetT5 ||Токио |nameT6 |streetT6 ||Токио ||streetT7 ||Токио ||streetT8 ||Токио ||streetT9 ||Токио ||streetT10 |+ ——-——- + + —————-——— + ———-——-——- +

Но с первоначальным ответом Гордона ниже я получаю:

+ ——-——-— + —————-——— + ———-——-——- + + |Город |Имена |Улицы |+ —————-— + —————-——— + ————-————- + |Париж |nameP1 |улицаP1 ||Париж |nameP2 |улицаP2 ||Париж |nameP3 |улицаP3 ||Париж |nameP4 |улицаP4 ||Париж |nameP5 |улицаP5 ||Токио |nameT1 |streetT1 ||Токио |nameT2 |streetT10 ||Токио |nameT3 |streetT2 ||Токио |nameT4 |streetT3 ||Токио |nameT5 |streetT4 ||Токио |nameT6 |streetT5 ||Париж ||улицаP6 ||Париж ||улицаP7 ||Токио ||streetT6 ||Токио ||streetT7 ||Токио ||streetT8 ||Токио ||streetT9 |+ ——-——-— + —————-——— + ———-——-——- +

Есть идеи?Кажется, где-то просто заказ, но я не могу понять ... Спасибо !!

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Я предполагаю, что вы хотите "вертикальные" списки.Это не совсем то, как работает SQL, но вы можете сделать это, используя row_number() и агрегирование:

select city, max(name) as name, max(street) as street
from ((select city, name, null as street,
              row_number() over (partition by city order by name) as seqnum
       from names
      ) union all
      (select city, null, street,
              row_number() over (partition by city order by street) as seqnum
       from streets
      )
     ) sn
group by city, seqnum
order by city, seqnum;
0 голосов
/ 27 сентября 2019

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

select city.cities, city.names, street.streets from city inner join street on city.cities=street.cities
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...