У меня есть следующий вопрос относительно того, какой из нижеприведенных sql подходит для типов вопросов.Правильное решение sql?
ВОПРОС 1:
У меня есть две таблицы: table1 и Таблица2. TABLE1 имеет 1 миллион записей и содержит идентификаторы переменных и AGE. AGE представляет собой переменную в квадратных скобках до ближайших 10-ти лет (например, 10, 20, 30, 40 ...). TABLE2 содержит 100 записей и имеет идентификаторы переменных и SALARY. Идентификатор уникален в каждом наборе данных. Ниже приведен SQL-запрос, который написал аналитик. Что это делает? Сколько строк имеет результирующая таблица?
SELECT a.ID,a.AGE,b.SALARY
FROM TABLE1 a LEFT JOIN TABLE2 b ON a.ID=b.ID
WHERE b.SALARY>50000
Мой первый ответ:
Этот запрос будет первым создать левое соединение двух таблиц. Таблица 1 с таблицей 2. Это означает, что он сохранит все совпадающие записи обеих таблиц, в которых выполняется совпадение с идентификатором. И он также сохранит все записи из таблицы1. Затем он помещает фильтр в эту левую таблицу соединений и выбирает только те записи, где зарплата индивидуума превышает 50000.
С точки зрения нет. записей, изначально было бы 1MM-записи, когда будет выполнено левое соединение. Но после фильтра он также может иметь нулевые записи, основанные на том, сколько записей на самом деле имеет зарплату более 50000. Если ни одна запись или ИД не имеет зарплаты более 50000, тогда она будет иметь нулевую запись в конце.
Кроме того, я считаю, если я a.salary, как показано ниже он должен дать ошибку право как переменная зарплата не присутствует в таблице 1.
SELECT a.ID,a.AGE,b.SALARY
FROM TABLE1 a LEFT JOIN TABLE2 b ON a.ID=b.ID
WHERE a.SALARY>50000
ВОПРОС 2: Я хочу, чтобы произвести набор данных, который имеет все записи из TABLE1, но только присоединяются к таблице 2, где зарплаты больше 50000. Как бы вы «исправили» запрос?
My answer: It should be below:
SELECT a.ID,a.AGE,b.SALARY
FROM TABLE1 a LEFT JOIN
(select Id, Salary from TABLE2 where salary >50000) as b
ON a.ID=b.ID
Это будет def. давать по крайней мере 1MM записи в качестве первого фильтра, а затем дает соединение.
Является ли это правильным пониманием для обоих?
«Сколько строк имеет результирующая таблица?» -> Выполнить его и посмотреть. Чтобы присоединяться только к строкам в таблице B, где зарплата выше 50K, сделайте эту часть критериев соединения: 'ON a.ID = b.ID AND b.Salary> 50000'. –
Кажется бессмысленным создание 1 000 000 строк ...если вы сделали это ПРАВОЕ СОЕДИНЕНИЕ, это даст только количество записей, где зарплата превышает 50 000. Обратите внимание: поскольку не может быть ни одного, выведите этот параметр на мгновение (например, удалите «WHERE b.SALARY> 50000»), чтобы подтвердить, что какая-либо из строк соединяется, если все строки в таблице b имеют соответствующие идентификаторы в a тогда вы получите 100 строк ... – russ
Да. Он более оптимизирован, чтобы сделать это как и. Я использую sql после трех лет, поэтому вроде ржавый сейчас и не понял, что могу использовать AND. – user