SQL视图:将初始表与分析表进行比较,以返回初始表中不存在的值

时间:2014-07-03 10:54:04

标签: sql sql-server join view

我的数据库中有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

非常感谢任何帮助。

2 个答案:

答案 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;