Правильный способ структурирования этого SQL-запроса для нескольких таблиц

#sql

#sql

Вопрос:

У меня проблема с веб-приложением javascript, которое использует единый вход в Microsoft Office. По какой-то причине, которую мне еще предстоит выяснить, пользователи дублируются в моей базе данных. Прежде чем я начну устранять неполадки, я хочу попробовать очистить базу данных.

Я хочу выполнить поиск любого пользователя в Employee таблице, у которого нет никаких предложений ни в одной из таблиц предложений. Таким образом, список пользователей, которые не вносили никаких предложений, у которых есть дублирующиеся учетные записи, которые я могу удалить. Каков был бы наилучший способ сделать это?

Также обратите внимание, что у rick (ID 6 и 7) вообще нет никаких вкладов. Удаление обеих учетных записей было бы проблематичным.

Сотрудник

 ID    name    hair
--------------------
1     bob     brown
2     jeff    blond
3     jeff    brown
4     steve   none
5     steve   none
6     rick    red
7     rick    red
  

suggestions_lunch

 ID    suggestion        status
---------------------------------
2     free food         planned
3     warmer coffee     declined
  

suggestions_pay

 ID    suggestion            status
----------------------------------------------
5     We pay bob too much   investigating
  

Здесь идентификатор 4 будет удален. Я думаю, мне понадобится второй SQL-запрос, который показывает всех пользователей, у которых есть несколько учетных записей без каких-либо вкладов в любом месте.

 SELECT * 
FROM employee 
WHERE ...
  

Ответ №1:

Простым способом проверить наличие или, скорее, несуществование значения предложения null в столбце «Предложения» было бы проверить с помощью is null

     SELECT e.name
          ,sl.suggestion
    FROM Employee e
    JOIN suggestion_lunch sl ON sl.ID = e.ID
    WHERE suggestion IS NULL;
  

Это хорошее начало того, что вы пытаетесь сделать. Он выберет имя из таблицы employee и предложение из таблицы suggestion_lunch.

После выбора имени и предложения мы внутренне объединяем их на том основании, что предложенный идентификатор обеда = идентификатор сотрудника

Наконец, мы используем WHERE для проверки наличия нулевых значений. Представьте, что когда мы выполняем запрос без предложения WHERE… мы получаем таблицу со всеми именами сотрудников и предложениями. Чтобы отображать только пользователей, у которых НЕТ предложений, мы используем предложение IS NULL, поскольку значение таблицы будет равно NULL, если не было сделано никаких предложений.

Что касается удаления дубликатов, я бы предложил отдельный запрос, объединенный с GO

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

1. это второй выбор (сл.предложение) в инструкции select … должен ли это быть sl.suggestion_pay и можете ли вы объединить его с другими (sl.suggestions_lunch). Тогда, я думаю, мне также нужно будет перечислить их в инструкции from? Из suggestion_lunch sl, suggestions_pay sp .. что-то вроде этого?

2. У меня это написано таким образом SELECT e.name, sl.suggestion , потому что я просто извлекаю столбец из таблицы вместо того, чтобы извлекать всю таблицу. Я свяжу этот столбец с другой таблицей позже в моем предложении JOIN, чтобы он знал, откуда я пытаюсь это извлечь. Использование только столбца sl.suggestions вместо таблицы suggestions_lunch более эффективно и помогает сохранить результаты ясными. Вы можете извлекать столько столбцов из разных таблиц, сколько захотите, при условии, что вы правильно их соединяете.