- Tham gia
- 17/8/08
- Bài viết
- 8,662
- Được thích
- 16,720
- Giới tính
- Nam
Chắc chắn là như thế, anh chọn cột nào thì phải select cột đó theo thứ tự anh đặt ra, còn muốn chọn hết là dấu sao (*)
Mình tưởng đâu chọn 7 to 10 được chứ!
Chắc chắn là như thế, anh chọn cột nào thì phải select cột đó theo thứ tự anh đặt ra, còn muốn chọn hết là dấu sao (*)
Mình tưởng đâu chọn 7 to 10 được chứ!
Hihi, vậy thì anh cứ test thử nhé.
2 lý do:
1. Trong đề bài có đặt điều kiện: tuỳ ý chọn cột. Vì vậy ta cứ đặt câu tổng quát rồi đến khi cần truy vấn thì chuyển đổi.
2. Thường thường dùng SQL động, viết câu tổng quát cho dễ nhìn. Khi thực sự truy vấn thì thay tham số vào.
Tôi dùng thuật này cho cả câu chuỗi kết nối.
Const CHUOIKN = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=<WBPathAndName>;Extended Properties=""Excel 8.0;HDR=No;"";"
.ConnectionString = Replace(CHUOIKN,"<WBPathAndName>",ThisWorkbook.FullName)
Ví dụ mình có đoạn code như bên dưới, các bạn cho hỏi là giữa inner join, left join và right join có sự khác biệt hay là không? Xin giải thích.
P/s: Do các phần trên chưa nói đến phần căn bản này nên xin bổ sung thêm, mong các bạn hưởng ứng.
Vấn đề sử dụng các phép nối bảng trên SQL , em cũng từng ngâm cứu qua( nhưng mà vẫn lơ mơ lù mù ),cụ thể sự khác nhau giữa các phương thức có thể tham khảo ở trang web này :http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
***Nếu sử dụng các phép nối chuỗi, ta có thể áp dụng bài toán cập nhật dữ liệu mà không cần dùng vòng lặp !
ví dụ như bài test Ado của 1 bạn đã hỏi trên GPE ( trong file đính kèm )!
Nếu dùng vòng lặp thì em viết như sau :
[GPECODE=vb]
Sub Update_Data_ADO()
Dim lsSQL As String, cnn As Object, lrs As Object
Dim Tmparr(), Item, iR As Long, Val1, val2
Set cnn = CreateObject("ADODB.Connection")
Set lrs = CreateObject("ADODB.Recordset")
With cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\DATA.xls" & _
";Extended Properties=""Excel 8.0;HDR=Yes;"";"
.Open
End With
Tmparr = Range("A2", [A65536].End(3)).Value
iR = 1
For Each Item In Tmparr
iR = iR + 1
If Len(Item) Then
Val1 = CDbl(Range("C" & iR & "")): val2 = CStr(Trim(Range("D" & iR & "")))
Debug.Print Val1; val2
lsSQL = "UPDATE [DATA$] " & _
"SET [Thanhtoan]= " & Val1 & ", [Phuong Thuc] = '" & val2 & "'" & _
"WHERE [Bill] Like '" & Item & "'"
lrs.Open lsSQL, cnn, 3, 1
End If
Next
Set lrs = Nothing
cnn.Close: Set cnn = Nothing
End Sub
[/GPECODE]
Còn nếu dùng Inner Joint thì em viết như sau :
[GPECODE=vb]
Sub Update_HLMT()
On Error GoTo Handle
Set Cn = CreateObject("ADODB.Connection")
Dim mySQL As String, strFile As Variant
strFile = Application.GetOpenFilename()
If strFile <> False Then
With Cn
mySQL = "UPDATE [Data$A2:F11] a " _
& "INNER JOIN " _
& "[Excel 8.0;HDR=No;IMEX=2;DATABASE=" _
& ThisWorkbook.FullName & "].[FORM$A2:E3] b " _
& "ON a.F1=b.F1 " _
& "SET a.F4=b.F3,a.F5=b.F4"
.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strFile & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Execute mySQL
.Close
End With
End If
Set Cn = Nothing
Exit Sub
Handle:
MsgBox Err.Description
End Sub
[/GPECODE]
Cám ơn bạn trả lời, mình chỉ muốn biết ngắn gọn là 3 trường hợp trên có gì khác.
Dạ , anh cho em hỏi nếu bây giờ em muốn inner Join lớn hơn 2 bảng , thì phải dùng câu lệnh nào tổng quát nhất ? Phép hợp Inner Jonin có hạn chế số lượng table không anh ?
[TIP]Với dữ liệu bài #166, bạn hãy liệt kê những mặt hàng không xuất hiện trong sheet Data2[/TIP].
Anh Hai Lúa Miền Tây à, vì số đông chưa biết cả lý thuyết nên xin anh trình qua cơ bản lý thuyết, hoặc anh gợi ý một tí, như bài vừa rồi thì em như botay.com, không biến lần theo đường này. Như những bài trước đây vậyHihi, vậy là phần join xem như kết thúc, xin cảm ơn mọi người, cảm ơn bạn hungpecc1 đã tích cực hưởng ứng phần join này.
Anh Hai Lúa Miền Tây à, vì số đông chưa biết cả lý thuyết nên xin anh trình qua cơ bản lý thuyết, hoặc anh gợi ý một tí, như bài vừa rồi thì em như botay.com, không biến lần theo đường này. Như những bài trước đây vậy
Cảm ơn Anh rất nhiều
[TIP]Với dữ liệu bài #166, bạn hãy liệt kê những mặt hàng không xuất hiện trong sheet Data2[/TIP].
Ở đây mình đang muốn nói đến join, nếu dùng như bạn thì nó thuộc về vấn đề khác.Trong phạm vi của câu hỏi về cách sử dụng LEFT JOIN thì câu trả lời của hungpecc1 là đúng.
Trong phạm vi mở rộng của ngôn ngữ SQL thì đề này nếu giải bằng lệnh WHERE NOT EXISTS thì hợp lô gic hơn - và dễ lồng trong câu truy vấn phụ hơn.
Select trường1, trường2, vv
From Bảng1
Where Not Exists (Select * From Bảng2 Where Khoá = Bảng1.Khoá)
Về vấn đề tốc độ truy vấn thì vì ở đây bảng là worksheet nên hiệu quả cũng gần như nhau, không đáng kể. Nếu bảng nằm trên CSDL nghiêm túc (như SQL Server,...) thì hiệu quả có thể khác.