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 以编程方式初始化可重用的表视图控制器