#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;