我的数据库中有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
非常感谢任何帮助。
答案 0 :(得分: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 :(得分:0)
使用减去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;