访问查询中的多表不等于

Posted

技术标签:

【中文标题】访问查询中的多表不等于【英文标题】:Multi Table NOT EQUAL in Access Query 【发布时间】:2012-11-25 18:39:25 【问题描述】:

我有两张桌子。车辆和所有权。我正在尝试进行查询,该查询将为我提供 OWNERSHIP 表中所有 VEHICLES NOT 的列表。我基本上需要一份关于我的可用车辆库存的报告。我试过这个查询:

SELECT VEHICLE.*
FROM VEHICLE, OWNERSHIP
WHERE (VEHICLE.VEH_ID <> OWNERSHIP.VEH_ID);

我得到:

当我做平等时,我会得到所有权中列出的所有车辆,这样就可以了。但是 NOT Equal 没有。有什么想法吗?

【问题讨论】:

【参考方案1】:

试试

SELECT VEHICLE.*
FROM VEHICLE
WHERE NOT EXISTS
(SELECT NULL FROM OWNERSHIP WHERE VEHICLE.VEH_ID= OWNERSHIP.VEH_ID);

【讨论】:

我正在努力学习这一点,所以如果我解释错了请告诉我。子查询正在查找同时属于 VEHICLE 和 OWNERSHIP 的车辆。而外部查询正在选择所有未被识别为同时属于 VEHICLE 和 OWNERSHIP 的车辆。它是否正确?这会被视为相关子查询吗? @Batman :是的,没错——这样的子查询可以被认为是相关的。但是,这并不总是意味着性能不佳,优化器足够聪明,不会对每一行都运行它...我不是 100% 确定 MS=Access 支持left join,但上面的查询与SELECT v.* FROM vehicle v LEFT JOIN ownership o ON (o.veh_id = v.veh_id) WHERE o.veh_id IS NULL 并且应该生成相同的执行计划。【参考方案2】:

如果您的表包含许多行,NOT EXISTS 方法可能会很慢。另一种更快的方法是使用带有WHERE 子句的LEFT JOIN 仅返回右侧连接字段为空的行。

SELECT VEHICLE.*
FROM
    VEHICLE AS v
    LEFT JOIN OWNERSHIP AS o
    ON v.VEH_ID = o.VEH_ID 
WHERE o.VEH_ID Is Null;

您可以使用 Access 的“查找不匹配的查询向导”来创建类似的查询。

如果两个表都很小,您可能不会注意到差异。但是应该很容易检查差异是否明显。如果您的表格随着时间的推移大幅增长,这种方法将为您提供更好的服务。

【讨论】:

以上是关于访问查询中的多表不等于的主要内容,如果未能解决你的问题,请参考以下文章

.net通用CMS快速开发框架——问题:Dapper通用的多表联合分页查询怎么破?

填充具有访问权限的多对多表

MySQL复杂的多表计数

Oracle中的多表查询(笛卡尔积原理)

Oracle中的多表查询

mybatis中的多表查询