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 函数在没有主键的表中列出列的主要内容,如果未能解决你的问题,请参考以下文章