1

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

我有一个名为“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 相关联。
上面的语句永远不会起作用,因为表 'NR_LIVES' 包含一个 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 的记录正确的间隔)。

我希望我的问题很清楚。如果没有,请毫不犹豫地提及。

4

2 回答 2

1

在我看来,您想做一些简单的联接查询。首先在此处此处查看这些参考资料,以使您更熟悉该方法。

其次,通常没有理由在子表中拥有额外的“查找”列,因为可以从适当的 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 ;
于 2012-07-06T16:06:07.847 回答
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
于 2012-07-09T09:14:49.833 回答