【问题标题】: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 没有。有什么想法吗?

【问题讨论】:

    标签: sql ms-access subquery correlated-subquery multi-table


    【解决方案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 的“查找不匹配的查询向导”来创建类似的查询。

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

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 2012-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多