相关表上的SQL SELECT查询

时间:2012-07-06 15:23:30

标签: ms-access vba access-vba

我有一个问题,我找到了一个相当长的解决方案,我不认为这是一个好习惯。 但是我觉得必须有一种语法可以立即解决这个问题而不会有太多复杂性。 我已经几次碰到这个问题了,我想一劳永逸地知道。

我有一个名为" T_STOP_LOSS"的表,其中我有三列" LIVES_FROM"," LIVES_TO"和" SL_VALUE" (所有数字类型+包含具有自动编号类型的ID的列)。 我想检索包含SL_VALUE的记录,其中变量值位于LIVES_FROM和LIVES_TO之间的间隔。

ID  LIVES_FROM   LIVES_TO   NR_COUNTRIES_FROM   NR_COUNTRIES_TO SL_VALUE
1   0   999 2   2   39,3
12  0   999 3   3   34,6
23  0   999 4   4   29,6
34  0   999 5   9   25,7
45  0   999 10  100 22,17
46  1000    1499    2   2   31,1
2   1000    1499    3   3   27,4
13  1000    1499    4   4   23,3
24  1000    1499    5   9   20,4
35  1000    1499    10  100 17,5
36  1500    1999    2   2   23,6
47  1500    1999    3   3   20,7
3   1500    1999    4   4   17,7
14  1500    1999    5   9   15,4
25  1500    1999    10  100 13,3
26  2000    2999    2   2   23,6
37  2000    2999    3   3   20,7
48  2000    2999    4   4   17,7
4   2000    2999    5   9   15,4
15  2000    2999    10  100 13,3

通常我会使用:

lNr_Lives = <Something> '(Retrieved via Textbox)
sSQL_Select = "SELECT SLVALUE FROM T_STOP_LOSS WHERE LIVES_FROM <= " & LNr_Lives & " AND LIVES_TO >= " & LNr_Lives & ";"

但是,LIVES_FROM和LIVES_TO通过外键与表NR_LIVES相关。
上述陈述永远不会奏效,因为表格&#39; NR_LIVES&#39;包含一个ID字段作为主键,用于链接到T_STOP_LOSS表。 (NR_LIVES中的列命名为:ID,NR_LIVES_FROM和NR_LIVES_TO(不重要))。

ID  NR_LIVES_FROM   NR_LIVES_TO
1   0   999
2   1000    1499
3   1500    1999
4   2000    2999

请告诉我,您认为最简单的方法是访问存储在NR_LIVES表中的LIVES_FROM和LIVES_TO的实际值,并使我的SELECT语句按照我期望的方式工作(返回包含SL为正确的间隔)。

我希望我的问题很明确。如果没有,请不要犹豫。

2 个答案:

答案 0 :(得分:1)

在我看来,你想要做一些简单的连接查询。首先查看这些参考文献herehere,以便您更熟悉该方法。

其次,通常没有理由在子表中添加额外的“查找”列,因为可以从适当的JOIN查询访问这些值。

我怀疑您正在寻找的查询是:

SELECT SLVALUE FROM
T_STOP_LOSS
INNER JOIN
NR_LIVES 
ON T_STOP_LOSS.ID=NR_LIVES.ID
WHERE 
NR_LIVES_FROM <=  LNr_Lives  
AND 
NR_LIVES_TO >= LNr_Lives ;

答案 1 :(得分:0)

感谢Nicolas,我找到了我需要的东西。

Dim cQueries                    As clsQueries
Dim oRst                        As DAO.Recordset
Dim sSQL_Select                 As String
Dim LNr_Lives                   As Long
Dim iNr_Countries               As Integer
Dim i As Integer


If Not IsNull(Me.txt_Nr_Lives) Then
    LNr_Lives = Me.txt_Nr_Lives
Else
    MsgBox "No number of lives defined!", vbCritical
    Exit Sub
End If

If Not IsNull(Me.cbb_Nr_Countries) Then
    iNr_Countries = Me.cbb_Nr_Countries
Else
    MsgBox "No number of countries defined!", vbCritical
    Exit Sub
End If

Set cQueries = New clsQueries
sSQL_Select = "SELECT " & _
                    "* " & _
                "FROM " & _
                    "T_STOP_LOSS " & _
                "INNER JOIN " & _
                    "NR_LIVES ON (T_STOP_LOSS.LIVES_FROM = NR_LIVES.ID) " & _
                " WHERE " & _
                    "NR_LIVES.NR_LIVES_FROM <= " & LNr_Lives & _
                " AND " & _
                    "NR_LIVES.NR_LIVES_TO >= " & LNr_Lives & _
                " AND " & _
                    "T_STOP_LOSS.NR_COUNTRIES_FROM <= " & iNr_Countries & _
                " AND " & _
                    "T_STOP_LOSS.NR_COUNTRIES_TO >= " & iNr_Countries & ";"

Set oRst = cQueries.Select_Statement(sSQL_Select)
oRst.MoveFirst

Do While Not oRst.EOF
    Me.txt_FSL = oRst![SL_VALUE]
    oRst.MoveNext
Loop