SQL 函数在没有主键的表中列出列

Posted

技术标签:

【中文标题】SQL 函数在没有主键的表中列出列【英文标题】:SQL function to list a column across tables without primary key 【发布时间】:2020-08-20 09:59:53 【问题描述】:

我有一个列出州的表和一个列出城市的表,State_number 充当城市表中的外键。是否可以通过州名列出城市?

这是我得到的最接近的:

SELECT State_name, City_name 
FROM States, Cities 
JOIN Cities on States.State_number = Cities.State_number
WHERE States.State_name IN ('Munich', 'Brandenburg');

当前输出示例:

State_name
City_name
Bavaria
Munich

Bavaria 
Nuremburg

Brandenburg
Berlin

而我希望得到类似的东西:

Munich
7
Brandenburg
10

【问题讨论】:

今日提示:切换到现代、明确的JOIN 语法!更容易编写(没有错误),更容易阅读和维护,如果需要更容易转换为外连接 我有点困惑。慕尼黑和勃兰登堡不是城市,不是吗? “7”和“10”是什么? 【参考方案1】:

加入他们并应用 WHERE 子句:

select st.state_name, c.city_name
from states s
  join cities c on s.state_number = c.state_number
where s.state_name = 'Bavaria';

要获取每个州的城市数量(这不是原始问题的一部分),您可以使用 group by

select st.state_name, count(*) as number_of_cities
from states s
  join cities c on s.state_number = c.state_number
where s.state_name in ('Brandenburg','Bavaria')
group by st.state_name;

【讨论】:

目前是分别列出每个州和城市。是否可以将它们全部归为各个州的一个标题,并计算每个州的城市数量?目前我得到:巴伐利亚慕尼黑巴伐利亚纽伦堡 编辑您的问题并向我们展示一些示例表数据和预期结果,全部为格式化文本(无图像)。 @Crocs123:现在这是一个完全不同的问题。【参考方案2】:

认为你想要:

SELECT s.State_name, c.City_name 
FROM States s JOIN
     Cities c
     ON s.State_number = c.State_number
WHERE c.City_name IN ('Munich', 'Brandenburg');

注意事项:

永远不要FROM 子句中使用逗号。 始终使用正确、明确、标准、可读的JOIN语法。 使用表别名!并限定所有列引用! 您的过滤器应该是城市名称而不是州名称。我认为这是您的查询版本的根本问题。

【讨论】:

以上是关于SQL 函数在没有主键的表中列出列的主要内容,如果未能解决你的问题,请参考以下文章

Sql Server中的游标最好只能用于有主键或唯一键的表

sql 查询没有主键的表

如何使用 SQL sum 函数在不同的 MySQL 表中添加具有相应主键的值?

火花 jdbc 读取调整 where 没有主键的表

SQL:选择另一个表中没有复合主键的条目

如何从没有数字主键的表中有效地选择随机行