仅当SELECT中的join返回null set时,如何返回所有记录

时间:2016-08-31 16:37:10

标签: sql vba ms-access-2003

我有一个表单中的列表框,该表单由基于同一表单中的另一个控件(ctrl1)的select查询填充。它是在更新ctrl1:

时触发的
PARAMETERS [Ctrl1 input] Long;
SELECT table1.column1, table1.column2
FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3
WHERE (((table3.column1)=[Ctrl1 input]))
ORDER BY table1.column2;

这是基于与table3.column1中的值匹配的表单参数,该值在table3.column3字段中具有值。现在,如果表单上的选择在table3.column3中没有匹配值,则列表框保持为空。在这种情况下,我宁愿返回SELECT table1.column1, table1.column2的完整列表,而没有所有的连接和约束。 (清单很长,所以我只想在绝对必要时使用整个东西。)

在SQL中,似乎case函数可以实现我想要的功能,类似于:

PARAMETERS [Ctrl1 input] Long;
CASE WHEN  (SELECT table3.column3 WHERE (table3.column2 = [Ctrl1 Input]) IS NOT NULL)
    THEN 
        SELECT table1.column1, table1.column2
        FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3
    ELSE 
        SELECT table1.column1, table1.column2

但我无法在Access查询中使用case

IIf声明似乎也可行,

PARAMETERS [Ctrl1 input] Long;
IIf(
    (SELECT  table3.column3 WHERE (table3.column1 = [Ctrl1 input]) IS NOT NULL),
    (SELECT table1.column1, table1.column2 FROM (table1 INNER JOIN table2 ON table1.column2 = table2.column1) INNER JOIN table3 ON table2.column2 = table3.column3),
    (SELECT table1.column1, table1.column2)
    )

但是Access不接受这一点,说它需要SELECTINSERTDELETE等。另外,测试一个SELECT IIf,我得到一些说法它只能返回一个值,因此对我不起作用。

所以,我看过有关在VBA中使用caseIIf然后在查询中使用THAT的文章,但我找不到足够明确的例子来理解我会将自己的情况转换为模块,然后调用它。我不使用VBA,几乎不使用SQL。在深入研究VBA之前,我想知道:

  1. 我能用VBA完成我想要的吗?
  2. 是否存在caseIIf或其他方法的论据?
  3. 在函数中,我作为值传递什么?来自表格ctrl1的数据?
  4. 我要求函数返回什么,以及如何返回?这是通过在函数本身中设置myfunction = the code that produces the dataset I need来实现的吗?
  5. 我想我理解如何在查询中使用该函数,只要我理解函数的输出类型即可。

    提前感谢任何见解和信息。

    注意:我正在使用Access 2016,但文件本身是2002-2003格式,因为这显然与我们的GIS软件兼容。

1 个答案:

答案 0 :(得分:1)

如果控件为空(或找不到匹配项)且不需要IIF或VBA,则有一种方法可以使Access不过滤。您需要告诉Access,如果输入为null,则只返回所有内容。您在顶部的查询将如下所示。

SELECT table1.column1, table1.column2
    FROM 
        (SELECT table1.column1, table1.column2
        FROM table1 
        INNER JOIN table2 
        ON table1.column2 = table2.column1)
INNER JOIN table3 
ON table1.column2 = table3.column3
    WHERE table3.column1 = [Ctrl1 input]
    OR [Ctrl1 input] is null
ORDER BY table1.column2;

OR行是什么告诉Access“你知道什么,如果我没有告诉你该怎么做就给我整个表格”。无论你的列表框是如何填充的,这段代码只关心列表框中的内容,而不关心它是如何到达的。像这样的代码可以进入Access查询的SQL视图。