Функция SQL для перечисления столбца в таблицах без первичного ключа

#sql #oracle #oracle12c

#sql #Oracle #oracle12c

Вопрос:

У меня есть таблица со списком состояний и одна с городами, где State_number действует как внешний ключ в таблице cities. Возможно ли перечислить города по названию их штата?

Это самое близкое, что я получил:

 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
  

Комментарии:

1. Совет сегодняшнего дня: переключитесь на современный, явный JOIN синтаксис! Проще писать (без ошибок), легче читать и поддерживать, и при необходимости легче преобразовать во внешнее соединение

2. Я немного сбит с толку. Разве Мюнхен и Бранденбург не являются городами , а не штатами ? Что такое «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;
  

Комментарии:

1. В настоящее время это список каждого штата и города отдельно. Возможно ли сгруппировать их все в одном заголовке для соответствующих штатов и подсчитать количество городов в каждом штате? На данный момент я получаю: Бавария Мюнхен Бавария Нюрнберг

2. Отредактируйте свой вопрос и покажите нам некоторые примеры табличных данных и ожидаемый результат, все в виде форматированного текста (без изображений).)

3. @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 синтаксис.
  • Используйте псевдонимы таблиц! И уточните все ссылки на столбцы!
  • Ваш фильтр должен быть по названию города, а не по названию штата. Я думаю, что это фундаментальная проблема с вашей версией запроса.