【问题标题】:Use switch and "in" in MS-Access Select Query在 MS-Access 选择查询中使用 switch 和“in”
【发布时间】:2022-01-02 14:49:24
【问题描述】:

假设我有两个表,其中第一个包含我的数据:

Automatic Manual
X1 X1
Y Y27

还有一个查找表

Lookup
X1
Y27
...

我想从第一个表中选择值,如果它包含在查找表中。 所以对于第二行,它应该取值 Y27,因为 Y 不在查找表中。

我用这个查询试了一下:

Select 
Switch(
       Automatic in (SELECT Lookup FROM LookupTable), Automatic,
       True, Manual,
      ) AS ValidEntry
FROM Datatable;

我的文本查询:检查“自动”中的值是否在查找表中,如果是 -> 取值,如果不是,则从另一列“手动”中取值并返回一个名为“ValidEntry”的条目”。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    使用 INNER JOIN,它应该更快。

    select somedata from table1 t  
    inner join lookupTbl l on l.lookupfield = t.automatic  
    

    带 IN 子句:

    select somedata from table1 t  
    WHERE t.automatic IN (select lookupfield FROM lookupTbl)
    

    【讨论】:

    • 非常感谢您接近帕特里克,但不幸的是,这些解决方案没有考虑另一列,它只是检查一列中的值是否在查找表中明显。我必须结合这些步骤,所以我可以同时针对另一个表验证 2 列,如果有效,则只返回 1 个值。
    • @SHA-256 然后使用 LEFT JOIN 并检查 NULL。它仍然比 Lookup 函数更有效。
    【解决方案2】:

    这是你需要做的:

    SELECT NZ( LookupTableAutomatic.Lookup, LookupTableManual.Lookup) AS Lookup
    FROM (LookupTable AS LookupTableManual INNER JOIN DataTable  
    ON LookupTableManual.Lookup = DataTable.Manual) 
    LEFT OUTER JOIN LookupTable AS LookupTableAutomatic ON LookupTableAutomatic.Lookup = DataTable.Automatic;
    

    作为解释,如果 NZ 函数不为空,则返回第一个参数,否则返回第二个。查找表被连接了两次:手动查找是一个内部连接,因为我假设总会有一个备用值,而自动查找作为一个外部连接连接,这意味着当值不匹配时它返回 NULL .

    【讨论】:

    • 仅供参考:Nz() 在性能方面远非理想。如果您有指向 SQL Server 或 Oracle 上的大型表的链接表,那将是一场噩梦。见allenbrowne.com/QueryPerfIssue.html
    • @Patrick Honorez afaik NZ 在类型为文本时(如本例)与 IIF 几乎没有什么不同。其次,如果 OP 使用 SQL Server 或 Oracle 的链接表,那么在链接服务器上而不是在 Access 中创建视图会大大提高效率,在这种情况下 COALESCE 是要走的路。
    • Jonathan:您显然没有阅读链接中的文章。根据经验,对于链接到 SQL Server 的大表,我可以保证 NZ 和 IIF 之间的差异是巨大的。使用 NZ 还会阻止从 Excel 读取查询,而 IIF 会起作用。
    • @PatrickHonorez 事实上,我确实读过这篇文章。我特别注意到有 4 个理由让我更喜欢 IIF 而不是 NZ。 1)它避免了函数调用; 2) 您保留预期的数据类型: 3) 标准应用正确;和 4) 列正确排序。对于这些 1)它仍在使用函数(IIF 而不是 NZ) 2)如果数据类型是文本(如此处)则无关 3)这实际上是什么意思???根本没有描述 - 如果它暗示 NZ 不起作用,这显然是荒谬的。 4) 与 2) 相同,如果该列仍然是文本,则不成立。所以不是很有说服力。
    猜你喜欢
    • 1970-01-01
    • 2021-08-12
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    相关资源
    最近更新 更多