首页 > 解决方案 > 如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?

问题描述

我正在尝试将 2 个表与每个 2 列结合起来:

每个表中的一列 ( Cities) 包含相似的信息,但其他列 (NamesStreets) 在每个表中是独立的。

使用 common 列,我只想将下 2 列中的所有其他元素组合并列出为一个表:

Cities | Names | Streets

列出原始表格中的所有Namesand 并在第一列中正确列出,不重复or (如果某个.StreetsCityNamesStreetsNamesStreetsCity

总结在这里:

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

我尝试了不同的连接,但是我得到了Namesand之间的所有组合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 |
+-------+---------+-----------+

请注意:

在下面跟进 Gordon 的回答:几乎就在那里,但不是 100%,因为我想把这座城市的行列在一起。如果我在党派中有更多的街道,那并不完全是 - 见:

如果我开始:

创建表名称(id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,城市 VARCHAR(30) NOT NULL,名称 VARCHAR(30) NOT NULL);

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

插入names( id, city, name) 值 (1, 'paris', 'nameP1'); 插入names( id, city, name) 值 (2, 'paris', 'nameP2'); 插入names( id, city, name) 值 (3, 'paris', 'nameP3'); 插入names( id, city, name) 值 (4, 'paris', 'nameP4'); 插入names( id, city, name) 值 (5, 'paris', 'nameP5'); 插入names( id, city, name) 值 (6, 'tokyo', 'nameT1'); 插入names( id, city, name) 值 (7, 'tokyo', 'nameT2'); 插入names( id, city, name) 值 (8, '东京', 'nameT3'); 插入names( id, city, name) 值 (9, 'tokyo', 'nameT4'); 插入names( id, city, name) 值 (10, 'tokyo', 'nameT5'); 插入names( id, city, name) 值 (11, 'tokyo', 'nameT6');

插入streets( id, city, street) 值 (1, 'paris', 'streetP1'); 插入streets( id, city, street) 值 (2, 'paris', 'streetP2'); 插入streets( id, city, street) 值 (3, 'paris', 'streetP3'); 插入streets( id, city, street) 值 (3, 'paris', 'streetP4'); 插入streets( id, city, street) 值 (3, 'paris', 'streetP5'); 插入streets( id, city, street) 值 (3, 'paris', 'streetP6'); 插入streets( id, city, street) 值 (3, 'paris', 'streetP7'); 插入streets( id, city,street) 值 (4, '东京', 'streetT1'); 插入streets( id, city, street) 值 (5, 'tokyo', 'streetT2'); 插入streets( id, city, street) 值 (6, 'tokyo', 'streetT3'); 插入streets( id, city, street) 值 (7, 'tokyo', 'streetT4'); 插入streets( id, city, street) 值 (8, 'tokyo', 'streetT5'); 插入streets( id, city, street) 值 (9, 'tokyo', 'streetT6'); 插入streets( id, city, street) 值 (10, 'tokyo', 'streetT7'); 插入streets( id, city, street) 值 (11, 'tokyo', ' 街道T8'); streets插入( id, city,street) 值 (12, '东京', 'streetT9'); 插入streets( id, city, street) 值 (13, 'tokyo', 'streetT10');

我正在创建这两个表:

表名+——————+——-——-——+————————+ | 编号 | 城市 | 姓名 | +——+————————+——-————+ | 1 | 巴黎 | 名称P1 | | 2 | 巴黎 | 名称P2 | | 3 | 巴黎 | 名称P3 | | 4 | 巴黎 | 名称P4 | | 5 | 巴黎 | 名称P5 | | 6 | 东京 | 名称T1 | | 7 | 东京 | 名称T2 | | 8 | 东京 | 名称T3 | | 9 | 东京 | 名称T4 | | 10 | 东京 | 名称T5 | | 11 | 东京 | 名称T6 | +——+————————+——-————+

桌子街道+——-——+————————+————————————+ | 编号 | 城市 | 街道 | +——-——+————————+——————————+ | 1 | 巴黎 | 街道P1 | | 2 | 巴黎 | 街道P2 | | 3 | 巴黎 | 街道P3 | | 4 | 巴黎 | 街道P4 | | 5 | 巴黎 | 街道P5 | | 6 | 巴黎 | 街道P6 | | 7 | 巴黎 | 街道P7 | | 8 | 东京 | 街道T1 | | 9 | 东京 | 街道T2 | | 10 | 东京 | 街道T3 | | 11 | 东京 | 街道T4 | | 12 | 东京 | 街道T5 | | 13 | 东京 | 街道T6 | | 14 | 东京 | 街道T7 | | 15 | 东京 | 街道T8 | | 16 | 东京 | 街道T9 | | 17 | 东京 | 街道T10 | +———+———-———+———-———-———+

我想得到:

+———-———-——+——————-———+———-———-———-—+ | 城市 | 姓名 | 街道 | +————————+————————+————————————+ | 巴黎 | 名称P1 | 街道P1 | | 巴黎 | 名称P2 | 街道P2 | | 巴黎 | 名称P3 | 街道P3 | | 巴黎 | 名称P4 | 街道P4 | | 巴黎 | 名称P5 | 街道P5 | | 巴黎 | | 街道P6 | | 巴黎 | | 街道P7 | | 东京 | 名称T1 | 街道T1 | | 东京 | 名称T2 | 街道T2 | | 东京 | 名称T3 | 街道T3 | | 东京 | 名称T4 | 街道T4 | | 东京 | 名称T5 | 街道T5 | | 东京 | 名称T6 | 街道T6 | | 东京 | | 街道T7 | | 东京 | | 街道T8 | | 东京 | | 街道T9 | | 东京 | | 街道T10 | +————————+————————+————————————+

但随着戈登的初步回应如下,我得到:

+———-———-——+——————-———+———-———-———-—+ | 城市 | 姓名 | 街道 | +————————+————————+————————————+ | 巴黎 | 名称P1 | 街道P1 | | 巴黎 | 名称P2 | 街道P2 | | 巴黎 | 名称P3 | 街道P3 | | 巴黎 | 名称P4 | 街道P4 | | 巴黎 | 名称P5 | 街道P5 | | 东京 | 名称T1 | 街道T1 | | 东京 | 名称T2 | 街道T10 | | 东京 | 名称T3 | 街道T2 | | 东京 | 名称T4 | 街道T3 | | 东京 | 名称T5 | 街道T4 | | 东京 | 名称T6 | 街道T5 | | 巴黎 | | 街道P6 | | 巴黎 | | 街道P7 | | 东京 | | 街道T6 | | 东京 | | 街道T7 | | 东京 | | 街道T8 | | 东京 | | 街道T9 | +————————+————————+————————————+

任何想法?似乎只是某个地方的订购问题,但我无法弄清楚....谢谢!

标签: mysqlsql

解决方案


我猜你想要“垂直”列表。这不是 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;

推荐阅读