组合框行源的SQL语句

时间:2013-09-04 13:48:30

标签: sql ms-access

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

我可以编写第一部分(varS匹配或为null):

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

我正在努力融入最终元素(var不存在于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个字段,自动编号

2 个答案:

答案 0 :(得分:0)

以下内容应该有效;

SELECT tblI.ID, tblI.S 
FROM tblI
WHERE tbl.ID=varS
OR varS NOT IN(SELECT ID from tblS)

答案 1 :(得分: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总是大于零的数字,变量中的ID小于1意味着ID为空。我将其用作创建新记录的信号,或返回所有记录,或者在给定上下文中从中派生出来的任何意义。