-
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
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)
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
Và
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)
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 -
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
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
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!