SQL вложенный запрос выбора оператора - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу получить доход на душу населения в городе (из таблицы 1), в котором есть школа, в которой есть Safety_score 1.

1.

select capitaincome, t1.city, safety_score
from tab1 t1,
     tab1 t2
where t1.city in (select t2.city from tab2 where safety_score = 1)   

2.

select capitaincome, t1.city, safety_score 
from tab1 t1,
     tab1 t2
where t1.city in (select city from tab2 where safety_score = 1)

Эти два дают мне разные выходные данные только из-за одного изменения во вложенном операторе select (t2.city и city). Оба они не дают требуемый результат для одной школы, но вместо этого первый дает список всех городов и их оценок безопасности школ, а второй дает мне список городов с наименьшим количеством баллов безопасности, а также всех других школ в этом городе. , Это ошибка, потому что в обеих таблицах есть название города столбца или есть ошибка в логике c и понимании?

1 Ответ

1 голос
/ 22 апреля 2020

Было бы намного проще, если бы вы могли предоставить полную структуру ваших таблиц. Я думаю, что ваша структура таблицы выглядит примерно так:

tab1 имеет столбец capitaincome и city

tab2 имеет столбец safety_score и city

Ошибка не в том, что обе таблицы имеют одинаковое имя столбца, что нормально. Существует проблема в логике c и понимании.

Проблема заключается в том, что вы создаете декартово произведение, но вам требуется внутреннее объединение: в то время как декартово произведение предоставляет вам результат, полученный объединением каждой строки из одна таблица с каждой строкой в ​​другой таблице при внутреннем объединении дает результат, в котором каждая строка из одной таблицы с одинаковым значением атрибута (в вашем случае с одним и тем же городом) объединяет строки из другой таблицы с одинаковым значением атрибута.

Вы не можете решить эту проблему, используя подзапрос и декартово произведение.

Вам нужно использовать предложение объединения:

select t1.capitaincome, t1.city, t2.safety_score
  from tab1 t1
  join tab2 t2 on t1.city = t2.city
 where t2.safety_score = 1

Или вы можете решить проблему, используя старый стиль соединения:

select t1.capitaincome, t1.city, t2.safety_score
  from tab1 t1,
       tab2 t2 
 where t1.city = t2.city
   and t2.safety_score = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...