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

Posted

技术标签:

【中文标题】SQL 视图:将初始表与分析表进行比较以返回初始表中不存在的值【英文标题】:SQL View: Comparing an initial table with a profiling table to return values not present in initial table 【发布时间】:2014-07-03 10:54:04 【问题描述】:

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

【讨论】:

不幸的是这不起作用,重复...下面的示例输出: 肯尼迪 - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K. Passage 208 25~1239920 The Kennedy - 0766145665 T.K.段落208 25~1239920 尝试将'DISTINCT'添加到第一个'SELECT':'SELECT DISTINCT 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' 我现在如何在 [Data Import] 表的输出中添加一个列? (约会时间)?只是随波逐流,与任何事物都没有关系…… 根据您的任务描述,您想在[数据导入]表中获取“第二个表中不存在的值”。因此,如果您在 [Data Import] 中有一些行,它将被排除在输出之外。【参考方案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;

【讨论】:

以上是关于SQL 视图:将初始表与分析表进行比较以返回初始表中不存在的值的主要内容,如果未能解决你的问题,请参考以下文章

从 NavigationController 以编程方式初始化可重用的表视图控制器

将主表与另一个表中的所有记录进行比较,以得出主表的列值

数据库表与视图的区别

数据结构——栈(线性表与链表)

如何将两个表与 SQL Server 中第二个表中引用同一列的两列连接起来

sql如何将一个表与另外一张表相关联