我正在尝试定义一个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个字段,自动编号
答案 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为空。我将其用作创建新记录的信号,或返回所有记录,或者在给定上下文中从中派生出来的任何意义。