代码之家  ›  专栏  ›  技术社区  ›  RAKH

访问仅匹配一个的vba sql

  •  2
  • RAKH  · 技术社区  · 9 年前

    ---------------------------------------------
    Name        | N1           | N2              |
    ----------------------------------------------
    A           | 500          | 300             |
    ----------------------------------------------
    A           | 0            | **-99**         |
    ----------------------------------------------
    B           | 60           | -99             |
    ----------------------------------------------
    B           | 77           | -99             |
    ----------------------------------------------
    C           | 0            | -99             |
    ----------------------------------------------
    C           | 15           | 100             |
    ----------------------------------------------
    C           | 30           | -9              |
    ----------------------------------------------
    

    ---------------------------------------------
    Name        | N1           | N2              |
    ----------------------------------------------
    A           | 500          | 300             |
    ----------------------------------------------
    A           | 0            | **200**         |
    ----------------------------------------------
    

    我已经完成了一些代码,但不知道如何完成它:

            Private Sub GET_TWO_COU()
    
                Dim COUs As Variant
                Dim p As Variant
                Dim sql As String
                Dim STR As New ADODB.Recordset
    
    
         sql = "SELECT DISTINCT NAME FROM STR_TBL"
        STR.Open sql, cnn, adOpenStatic
        STR.MoveLast
        STR.MoveFirst
        COUs = STR.GetRows(STR.RecordCount)
        STR.Close
    
        For Each p In COUs 
    
          Q1 = "SELECT NAME FROM STR_TBL"
            STR.Open sql, cnn, adOpenStatic
    
           Do Until STR.EOF
           DoEvents
                   sql = " UPDATE STR_TBL I" _
                        & "Set I.N2 = IIf(I.N2 = -99, DLookup(""N1 - N2"" ," _
                        & """STR_TBL"" , '"[NAME] ='" & p & "' AND N2<> -99""), N2)" _
                        & "WHERE I.[NAME] IN (SELECT I.[NAME] FROM STR_TBL I" _
                        & " GROUP BY I.[NAME] HAVING (Count(I.[NAME]) = 2)" _
                        & "AND (Min(I.N2) <> Max(I.N2))AND (Min(I.N2) = -99 OR Max(I.N2) = -99))"
    
                DoCmd.SetWarnings False
                DoCmd.RunSQL sql
                DoCmd.SetWarnings True
                          STR.MoveNext
               Loop
               STR.Close
    NEXT
    
         End Sub
    

    另一个问题是,它将向所有匹配的行添加相同的值!为什么会这样?我在循环中做错了什么吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Parfait    9 年前

    考虑一个具有细微差别的纯SQL解决方案 UPDATE 在中包含子查询的查询 WHERE IIF() ,和域聚合, DLookUp .

    UPDATE myTable t
    SET t.N2 = IIF(t.N2 = -99, DLookUp("N1-N2", "myTable", "[Name]='" & t.[Name] & "' AND N2 <> -99"), N2)
    WHERE t.[Name] IN (SELECT t.[Name]
                       FROM myTable t
                       GROUP BY t.[Name]
                       HAVING (Count(t.[Name]) = 2) 
                          AND (Min(t.N2) <> Max(t.N2)) 
                          AND (Min(t.N2) = -99 OR Max(t.N2) = -99))
    

    餐桌前

    Name    N1   N2
    A      500  300
    A        0  -99
    B       60  -99
    B       77  -99
    C        0  -99
    C       15  100
    C       30   -9
    

    Name    N1   N2
    A      500  300
    A        0  200
    B       60  -99
    B       77  -99
    C        0  -99
    C       15  100
    C       30   -9