У меня проблема. У меня есть таблица, в которой я state_id, city_id, name и type. В названии столбца есть все названия, а тип говорит о том, является ли это название государством или городом. Если это штат, то city_id имеет значение null, а если это город, у него есть state_id и city_id. Мне нужно выбрать все города в качестве столбца с названиями и название штата, в котором они находятся, в качестве второго столбца. Я пробовал примерно так:

SELECT
 case when type = 'state' then name end as State
 , case when type = 'city' then name end as City
  FROM table

Но таким образом я получаю название штата и город как нулевые, а затем все название города с нулевым состоянием ...

Пример данных:

state_id, city_id, name, type
1, NULL, Arizona, state
1, 1, Phoenix, city
1, 2, Scottsdale, city
2, NULL, California, state
2, 1, Beverly Hills, city
2, 2, Oakland, city

И я хочу получить результат:

State, City
Arizona, Phoenix
Arizona, Scottsdale
California, Beverly Hills
California, Oakland
1
throwaway997 6 Июл 2021 в 21:23

3 ответа

Лучший ответ

Вам нужно присоединить стол к себе; что-то вроде:

Select a.Name as City, b.Name as State
from MyTable a
left join MyTable b
on a.State_Id = b.State_ID
where a.type = 'city'
and b.type = 'state'
0
APH 6 Июл 2021 в 18:36

Вы хотите иметь таблицу, содержащую все состояния, и таблицу, содержащую все города (и соответствующий идентификатор состояния). Объединение этих таблиц дает вам набор данных, который вы ищете.

SELECT a.state, b.city
FROM (SELECT state_id, name
      FROM your_table
      WHERE type = state
      GROUP BY state_id) a
LEFT JOIN (SELECT state_id, city_id, name
      FROM your_table
      WHERE type = city
      GROUP BY city_id) b
ON a.state_id = b.state_id
0
AlexanderP 6 Июл 2021 в 18:38

В этом запросе используется один подзапрос:

SELECT (SELECT NAME FROM TEMP WHERE STATE_ID = A.STATE_ID AND CITY_ID IS NULL) State, 
NAME City 
FROM TEMP A WHERE TYPE = 'City'
0
Ambuj Mani Tripathi 6 Июл 2021 в 18:48