0

我正在尝试定义一个 SQL 语句以用作 MSAccess 表单上 ComboBox 的行源。SQL 应该从表 tblI 中选择记录,其中特定表字段与用户设置的变体参数 varS 匹配;然而,如果 varS 为 Null 或不存在于另一个表 tblS 中,则 SQl 应选择 tblI 中的所有记录。

我可以编写此代码的第一部分(varS 匹配或为空):

SELECT tblI.ID, tblI.S FROM tblI WHERE ((tblI.S = varS) OR (varS Is Null)) ORDER BY tblI.ID;

我正在努力的地方是合并最后一个元素(varS 不存在于 tblS 中)。我可以为 tblS 中没有 varS 编写一个测试:

Is Null(DLookup("[tbls.ID]","tblS","[tblS.ID]= " & varS))

但我不知道如何将其合并到 SQL 语句中。这应该工作吗?

SELECT tblI.ID, tblI.S FROM tblI WHERE tblI.S = varS OR varS Is Null OR DLookup("[tbls.ID]","tblS","[tblS.ID]= " & varS) Is Null ORDER BY tblI.ID;

当作为查询运行时,无论 varS 的值如何,它都会返回 tblS 中的每条记录。

表结构:

tblI 包含 2 个字段,Autonumber ID 和 Long S

tblS 包含 1 个字段,自动编号 ID

4

2 回答 2

0

以下应该有效;

SELECT tblI.ID, tblI.S 
FROM tblI
WHERE tbl.ID=varS
OR varS NOT IN(SELECT ID from tblS)
于 2013-09-04T14:00:35.830 回答
0

我自己解决这个问题的方法是这样的:

Private Sub SetComboSource(vID as Variant)
    Dim sSQL as String
    sSQL = "SELECT tblI.ID, tblI.S " & _
        "FROM tblI "
    If IsNull(vID) = False Then
        If IsNumeric(vID) = True Then
            If DCount("ID", "tblS", "ID = " Clng(vID)) > 0 Then
                sSQL = sSQL & "WHERE tblI.S = " & CLng(vID)
            End If
        End If
    End If
    sSQL = sSQL & " ORDER BY tblI.ID"
    Me.cboComboBox.RowSource = sSQL
End Sub

顺便说一句,我建议您为表和字段提供更具描述性的名称,然后在 SQL 中使用别名,尤其是表名。我也认为最好避免使用 Variant 变量。我通常将 Longs 用于这样的事情,我取一个小于 1 的值来表示用户没有选择任何东西,或者选择了 ALL,或者你想从中获得的任何含义。换句话说,我的 ID 总是大于零的数字,变量中小于 1 的 ID 意味着 ID 为空。我将其用作创建新记录或返回所有记录或在给定上下文中您想从中派生的任何含义的信号。

于 2013-09-04T14:48:34.067 回答