【问题标题】:SQL function to list a column across tables without primary keySQL 函数在没有主键的表中列出列
【发布时间】: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”是什么?

标签: sql oracle oracle12c


【解决方案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语法。
  • 使用表别名!并限定所有列引用!
  • 您的过滤器应该是城市名称而不是州名称。我认为这是您的查询版本的根本问题。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 2010-09-10
    • 2011-08-09
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多