【问题标题】:Access substitute for EXCEPT clauseEXCEPT 子句的访问替代
【发布时间】:2013-04-12 20:43:09
【问题描述】:

如何在 ms 访问中获得与下面的 SQL 代码相同的结果?它无法识别EXCEPT 子句...

SELECT DISTINCT 
       P.Name, 
       T.Training
  FROM Prof AS P, 
       Training_done AS TC, 
       Trainings AS T
 WHERE (P.Name Like '*' & NameProf & '*') 
   AND (P.Primary_Area = T.Cod_Area)
EXCEPT
SELECT DISTINCT 
       P.Name, 
       T.Training
  FROM Prof AS P, 
       Training_done AS TC, 
       Trainings AS T
 WHERE (P.Name Like '*' & NameProf & '*') 
   AND (P.Cod_Prof = TC.Cod_Prof);

提前致谢!

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    为了摆脱EXCEPT,您可以结合条件并否定第二个:

    SELECT DISTINCT 
           P.Name, 
           T.Training
      FROM Prof AS P, 
           Training_done AS TC, 
           Trainings AS T
     WHERE ((P.Name Like '*' & NameProf & '*') AND
            (P.Primary_Area = T.Cod_Area)) 
       AND NOT ((P.Name Like '*' & NameProf & '*') AND
                (P.Cod_Prof = TC.Cod_Prof));
    

    【讨论】:

    • +1 我是按照WHERE NOT EXISTS ({except query}) 的思路思考的,但是对于这种特殊情况,您的方法要简单得多。
    【解决方案2】:
    SELECT A.x FROM A
    EXCEPT
    SELECT B.x FROM B
    

    对应于

    SELECT A.x FROM A 
    LEFT JOIN B 
    ON A.x = B.x 
    WHERE B.x IS NULL
    

    【讨论】:

    • 根据this 文章EXCEPT 子句也会发现差异,而不仅仅是NULL 条件。
    【解决方案3】:

    使用MS Access > Create > Query Wizard中的find unmatched wizard,你会得到以下结果

    Union 是一个单独的 Access Query,我用来合并几个表而不是使用子查询

    SELECT TableMain.Field1
    FROM TableMain LEFT JOIN [Union] ON TableMain.[Field1] = Union.[field1]
    WHERE (((Union.field1) Is Null));
    

    【讨论】:

      【解决方案4】:

      这里不是一个明确的例子,但考虑对两个获取的表进行 UNION 并从该联合中选择具有少于 2 个特定字段组合实例的对。这意味着,如果每个表在字段组合上具有多个具有相同值的记录实例,则这些记录是相同的并且可以从结果集中消除。如果不是,它们对一个表是唯一的,只留下所选表中与另一表不匹配的记录。有点像穷人的“除了”KW。

      【讨论】:

        猜你喜欢
        • 2020-10-28
        • 1970-01-01
        • 2019-03-05
        • 2019-11-13
        • 2014-08-06
        • 1970-01-01
        • 2019-05-07
        • 1970-01-01
        • 2016-05-21
        相关资源
        最近更新 更多