访问查询中的多表不等于
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 的“查找不匹配的查询向导”来创建类似的查询。
如果两个表都很小,您可能不会注意到差异。但是应该很容易检查差异是否明显。如果您的表格随着时间的推移大幅增长,这种方法将为您提供更好的服务。
【讨论】:
以上是关于访问查询中的多表不等于的主要内容,如果未能解决你的问题,请参考以下文章