2015-06-05 5 views
1

У меня есть следующий вопрос относительно того, какой из нижеприведенных 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 записи в качестве первого фильтра, а затем дает соединение.

Является ли это правильным пониманием для обоих?

+1

«Сколько строк имеет результирующая таблица?» -> Выполнить его и посмотреть. Чтобы присоединяться только к строкам в таблице B, где зарплата выше 50K, сделайте эту часть критериев соединения: 'ON a.ID = b.ID AND b.Salary> 50000'. –

+0

Кажется бессмысленным создание 1 000 000 строк ...если вы сделали это ПРАВОЕ СОЕДИНЕНИЕ, это даст только количество записей, где зарплата превышает 50 000. Обратите внимание: поскольку не может быть ни одного, выведите этот параметр на мгновение (например, удалите «WHERE b.SALARY> 50000»), чтобы подтвердить, что какая-либо из строк соединяется, если все строки в таблице b имеют соответствующие идентификаторы в a тогда вы получите 100 строк ... – russ

+0

Да. Он более оптимизирован, чтобы сделать это как и. Я использую sql после трех лет, поэтому вроде ржавый сейчас и не понял, что могу использовать AND. – user

ответ

1

Это звучит как домашние вопросы, но вы, кажется, неплохо ответили на них.

Первый запрос возвращает от 0 до 100 строк. Зачем? Просто. Предложение WHERE превращает LEFT JOIN в INNER JOIN. В несоответствующих строках b.SALARY - NULL и не выполняется условие WHERE. Ваш ответ на первый вопрос неполный.

Самый простой ответ на второй вопрос - переместить условие из предложения WHERE в пункт ON. Ваш ответ также верен, но потенциально может путать оптимизатор и создать менее оптимальный план запроса (хотя и не в SQL Server). Фактически, когда я впервые узнал LEFT JOIN, я использовал подзапросы для этой цели, прежде чем привыкнуть к дополнительным условиям в предложении ON.

Ваш ответ на второй вопрос приемлемый, но, вероятно, не желаемый ответ.

+0

Вы имеете в виду, что первый запрос возвращается между 0-1MM ?. Вы упомянули 0-100. Поэтому спросите, имеете ли вы значение 0-1MM. И да, мы можем использовать и тоже. Я этого не понимал. – user

+2

@user. , , Нет, я думаю, я был совершенно ясен. Между 0 и 100. Вторая таблица содержит 100 уникальных идентификаторов, соответствующих уникальным идентификаторам в другой таблице. Предложение WHERE включает операцию объединения во внутреннее соединение. Можно вернуть только максимум 100 строк. –

+0

Да. Ты прав. Где бы внутренний и внутренний верхний предел составлял 100 – user