Представление SQL: Сравнение исходной таблицы с таблицей профилирования для возврата значений, отсутствующих в исходной таблице

#sql #sql-server #join #view

#sql #sql-server #Присоединиться #Вид

Вопрос:

В моей базе данных есть 2 таблицы. Первая таблица содержит несколько маршрутов и патрулей. На каждом маршруте может быть несколько патрулей. Для каждого патрулирования отправляется несколько тегов. Вторая таблица содержит только маршруты и теги, в основном полный набор тегов для этого маршрута.

Мне нужно для каждого патрулирования возвращать значения из второй таблицы, которые отсутствовали (иначе перечислять теги, которые не были записаны на этом маршруте и патрулировании).

 **Table:Data Import:**
RouteID
PatrolID
TagID

**Table:Routes**
RouteID
TagID
  

Имеет ли это смысл? Я пробовал NOT IN, LEFT JOINS и NOT EXISTS, но, похоже, я не могу правильно использовать свою логику. Моя последняя попытка (полностью) заключалась в следующем:

О, и я создаю представление. Я хотел бы, чтобы приведенные ниже столбцы были включены в мой вывод, но вам не обязательно использовать их в своем ответе.

  CREATE VIEW TagsNotPresent AS
    SELECT 
    [Data Import].[Company name], 
    [Data Import].[Site name], 
    [Data Import].[Patrol ID], 
    [Data Import].[Route id], 
    [Data Import].[Occurrence date], 
    [Data Import].[Tag name] 
    FROM [Data Import]
    LEFT OUTER JOIN Routes 
    ON Routes.[Route id] = [Data Import].[Route id] 
    AND Routes.[Tag name] = [Data Import].[Tag name] 
    WHERE Routes.[Tag name] IS NULL
  

Любая помощь была бы высоко оценена.

Ответ №1:

EXCEPT может помочь вам:

 SELECT r.RouteId,di.PatrolID,r.TagId
    FROM Routes r
    INNER JOIN (SELECT DISTINCT RouteId, PatrolID from DataImport) as di on di.RouteId = r.RouteId
EXCEPT
SELECT RouteId,PatrolID,TagId
FROM DataImport
  

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

1. К сожалению, это не работает, повторение… Пример вывода ниже:

2. Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~ 1239920 Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~ 1239920 Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~ 1239920 Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~ 1239920 Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~ 1239920 Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~1239920 Кеннеди — 0766145665 Т.К. Отрывок 208 25 ~1239920 Кеннеди — 0766145665 Т.К. Проход 208 25 ~1239920 Кеннеди — 0766145665 Т.К. Проход 208 25 ~ 1239920 Кеннеди — 0766145665 Т.К. Проход 208 25 ~1239920 Кеннеди — 0766145665 Т.К. Проход 208 25 ~ 1239920

3. Попробуйте добавить ‘DISTINCT’ к первому ‘SELECT’: ‘ВЫБЕРИТЕ DISTINCT r.routeId,di.PatrolID,r.TagID Из Routes r INNER JOIN (ВЫБЕРИТЕ DISTINCT routeId, PatrolID из DataImport) как di в di.routeId = r.routeId, ЗА ИСКЛЮЧЕНИЕМ ВЫБОРА routeId, PatrolID, TagID ИЗ DataImport’

4. Как бы мне теперь добавить coloumn в этот вывод из таблицы [Импорт данных]? (Дата-время)? Просто пометка, никаких связей ни с чем…

5. Согласно описанию вашей задачи, вы хотите получить «значения из второй таблицы, которых не было» в таблице [Импорт данных]. Поэтому, если у вас есть в [Импорт данных] несколько строк, они будут исключены из выходных данных.

Ответ №2:

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

   select distinct patrol_id, routes.*
   from data_import
   join routes
   on data_import.route_id = routes.route_id
 minus
   select patrol_id, routes.* 
   from data_import
   join routes
   on data_import.route_id = routes.route_id and data_import.tag_id = routes.tag_id;