• Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B
  • Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    duynamvnn1208 > 30-06-17, 06:24 PM

    Chào cả nhà, hiện tại mình có một vấn đề muốn tham khảo ý kiến như sau:

    Mình có bảng A 1000 dòng, bảng B 100 dòng. 2 bảng có chung field name: C
     - Giờ mình muốn lấy dữ liệu bảng A mà ko chứa dữ liệu bảng B. Mọi người có thể cho mình hướng để lấy không vậy?

    Note: Hiện mình cũng đã thử cách là dùng Code SQL, nhưng cách này rất chậm. Hoặc do mình dùng không đúng happy
    Mình cũng thử thêm dùng DAO, nhưng lại gặp 1 vấn đề mình hỏi thêm là:
     - Đối với Query có sử dụng Group By thì khi mình Set QueryDef cho nó, sau đó mình Set tiếp OpenRecordset thì toàn báo lỗi, Mình có đưa query đó ra Table xong mới Set OpenRecordset thì Ok --> Liệu có phải với Query sử dụng Group By thì sẽ ko làm được vậy khổng?(mình nghĩ vậy nhưng ko dám chắc)

    happy Cả nhà ai biết giúp mình nhé
  • RE: Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    ongke0711 > 30-06-17, 06:31 PM

    Sao bạn không dùng Query (với Left Join) mà dùng code?
    -----------------------------------------------
    SELECT A.*
    FROM A LEFT JOIN B ON A.C = B.C
    WHERE B.C Is Nul;
    -----------------------------------------------
  • RE: Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    lehongduc > 30-06-17, 07:43 PM

    Chào Bạn,
    Với 1 QueryDef (là 1 Object của DAO), nó có 1 method là OpenRecordset.
    Nếu Bạn muốn truy xuất các mẫu tin do QueryDef cung cấp, Bạn chỉ cần sử dụng method OpenRecordset của QueryDef đó là xong thôi.
    Xin xem ví dụ sau đây sử dụng method OpenRecordset của QueryDef xác định:
    Mã:
    Function GetrstTemp(qdfTemp As QueryDef)

       Dim rstTemp As Recordset

       With qdfTemp
          Debug.Print .Name
          Debug.Print "  " & .SQL
     
          Set rstTemp = .OpenRecordset(dbOpenSnapshot)

          With rstTemp

             .MoveLast
             Debug.Print "  Number of records = " & .RecordCount
             Debug.Print
             .Close
          End With

       End With

    End Function

    Và ta sẽ dùng Function trên trong Sub sau đây để truy xuất các mẫu tin của 1 QueryDef
    Mã:
    Sub QueryDefX()

       Dim dbsNorthwind As Database
       Dim qdfNew As QueryDef
       Dim qdfLoop As QueryDef
       Dim prpLoop As Property

       Set dbsNorthwind = OpenDatabase("Northwind.mdb")

       Set qdfNew = dbsNorthwind.CreateQueryDef("NewQueryDef", "SELECT * FROM Categories")

       With dbsNorthwind
          Debug.Print .QueryDefs.Count & " QueryDefs in " & .Name

          For Each qdfLoop In .QueryDefs
             Debug.Print "  " & qdfLoop.Name
          Next qdfLoop

          With qdfNew
             Debug.Print "Properties of " & .Name

             For Each prpLoop In .Properties
                On Error Resume Next
                Debug.Print "  " & prpLoop.Name & " - " &  IIf(prpLoop = "", "[empty]", prpLoop)
                On Error Goto 0
             Next prpLoop
          End With
          .QueryDefs.Delete qdfNew.Name
          .Close
       End With

    End Sub

    Nguồn: https://msdn.microsoft.com/en-us/library...onSection1
  • RE: Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    lehongduc > 30-06-17, 08:37 PM

    Và đây là ví dụ cụ thể cho 1 Query có sử dụng GROUP BY
    Mã:
    Function GetrstTemp(qdfTemp As QueryDef)
     
        Dim rstTemp As Recordset
        Dim fld As Field, fldname As String
        Dim k As Integer
        Dim RecSt As String
      
        With qdfTemp
            Debug.Print .Name
            Debug.Print "  " & .SQL
         
            Set rstTemp = .OpenRecordset(dbOpenSnapshot)
            Do Until rstTemp.EOF
                k = k + 1
                RecSt = ""
                For Each fld In rstTemp.Fields
                    fldname = fld.Name
                    RecSt = RecSt & " - " & fldname & " : " & rstTemp(fldname)
                Next
                Debug.Print "- Record " & k
                Debug.Print RecSt
                rstTemp.MoveNext
            Loop
        End With
        rstTemp.Close
        Set rstTemp = Nothing
    End Function


    Mã:
    Sub CreateQueryDefX()
     
    Dim dbs As Database
    Dim qdfTemp As QueryDef
    Dim qdfNew As QueryDef
    Dim sqlSt As String
      
    Set dbs = CurrentDb()
     
    With dbs
        sqlSt = "SELECT Categories.CategoryName, Count(Products.ProductName) AS CountOfProductName"
        sqlSt = sqlSt & " FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID"
        sqlSt = sqlSt & " GROUP BY Categories.CategoryName;"
        Set qdfTemp = .CreateQueryDef("", sqlSt)
            
        GetrstTemp qdfTemp
       
        .Close
    End With
      
    Set dbs = Nothing
    End Sub

    Có File đính kèm theo NorthWind của MS
  • RE: Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    duynamvnn1208 > 01-07-17, 10:23 AM

    Cảm ơn các bạn,

    Mình cũng viết SQL nhưng kết quả ra chậm quá, để mình thử viết lại theo Code của bạn xem sao (mình cũng dùng kiểu Select Where thôi, nhưng chậm quá nên mình xóa rồi  007 )

    Về phần OpenRecordset Code của mình như sau

    Mã:
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset

    Set qdf = CurrentDb.QueryDefs!queryName1
    Set rst = qdf.OpenRecordset(dbOpenDynaset, dbForwardOnly)

    Do While Not rst.EOF
    MsgBox("Thanks All Friends!")
    rst.MoveNext
    Loop 

    Như mình nói ở trên là queryName1 là kiểu Group By nên lúc chạy nó báo lỗi, còn khi mình chuyển dữ liệu của queryName1 sang bảng(Make Table) sau đó sử dụng RecordSet bình thường thì ko có sao (đương nhiên lúc này qdf bên trên ko cần thiết nữa). Ko biết Group By có ảnh hưởng ko các bạn happy
  • RE: Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    lehongduc > 01-07-17, 09:16 PM

    (01-07-17, 10:23 AM)duynamvnn1208 Đã viết: Ko biết Group By có ảnh hưởng ko các bạn happy
    Chào Bạn,
    Hình như Bạn không đọc nội dung tôi trả lời.
    Trong ví dụ minh họa, tôi đã tạo ra 1 Query với câu lệnh SQL có dùng GROUP BY đó.
    Và nếu Bạn test sẽ thấy vẫn OpenRecordset bình thường. Tôi có kèm theo file mdb có ví dụ minh họa vừa nói ở trên, để Bạn khỏi phải nhập lại code mất công.
  • RE: Lấy dữ liệu bảng A mà ko trùng dữ liệu bảng B

    duynamvnn1208 > 02-07-17, 09:34 AM

    (01-07-17, 09:16 PM)lehongduc Đã viết:
    (01-07-17, 10:23 AM)duynamvnn1208 Đã viết: Ko biết Group By có ảnh hưởng ko các bạn happy
    Chào Bạn,
    Hình như Bạn không đọc nội dung tôi trả lời.
    Trong ví dụ minh họa, tôi đã tạo ra 1 Query với câu lệnh SQL có dùng GROUP BY đó.
    Và nếu Bạn test sẽ thấy vẫn OpenRecordset bình thường. Tôi có kèm theo file mdb có ví dụ minh họa vừa nói ở trên, để Bạn khỏi phải nhập lại code mất công.

    Chào bạn lehongduc, cám ơn bạn đã gửi code mình xem, hôm qua mình có xem, nhưng khi mở ra mình không để ý Code chỉ nằm trong VBA. Thường mình lọc bằng Query xong VBA chỉ để xử lý thôi.
    Dù sao cũng cám ơn bạn, chắc do Code của mình có một vấn đề gì mà mình chưa tìm ra được, để mình tìm hiểu lai xem sao!