Chuyên đề giải đáp những thắc mắc về code VBA

Liên hệ QC

maytinhvp01

Thành viên thường trực
Tham gia
27/7/13
Bài viết
390
Được thích
179
Mình muốn nhờ giải thich câu lệnh " If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c) "
trong ví du:
Public Function LonNhat(Ran As Range)
Dim max As Double, v As Integer, d As Integer, c As Integer
max = Ran.Cells(1, 1)
For d = 1 To Ran.Rows.Count
For c = 1 To Ran.Columns.Count
If Ran.Cells(d, c) > max Then max = Ran.Cells(d, c)
Next c
Next d
v = Tim(max, Ran)
LonNhat = max
End Function
-------------------------------------------------------
[INFO1]Thông báo:
Vì topic này:
http://www.giaiphapexcel.com/forum/...ải-thích-các-code-đề-nghị-các-bạn-gửi-vào-đây
đã quá dài nên BQT đóng lại.
Nay tôi mở topic mới với cùng chủ đề: GIẢI THÍCH NHỮNG THẮC MẮC VỀ CODE
Các bạn nếu có nhu cầu giải thích code, vui lòng post tại đây nhé
NDU96081631

[/INFO1]
 
Chỉnh sửa lần cuối bởi điều hành viên:
Em có giải bài tập này bằng cách sử dụng 2 làn Dic, tuy nhiên không hiểu sao cứ bị báo lỗi ở dòng bôi đỏ, mọi người chỉnh lại giúp em nha:
Mã:
Option Explicit
---------------------------------------------------------------------------------------------------
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "C1" Then
  Range("C2:C9").ClearContents
  Dim dic1 As Object, dic2 As Object, i As Long, j As Long
  Set dic1 = CreateObject("Scripting.Dictionary")
  Set dic2 = CreateObject("Scripting.Dictionary")
'========================================================
For i = 2 To 8
  If Cells(i, 2).Value = Target.Value Then
     dic1.Add Cells(i, 1).Value, ""
  End If
Next i
'========================================================
For j = 2 To 8
  If Not dic1.exists(Cells(j, 1).Value) Then
[B][COLOR=#ff0000]    dic2.Add Cells(j, 1).Value, ""[/COLOR][/B]
  End If
Next j
'==========================================================
  Range("C2").Resize(dic2.Count) = WorksheetFunction.Transpose(dic2.keys)
End If
  
End Sub

Yêu cầu của bào tập là lập liệt kê các tỉnh mà tên người được cho ở cell C1 chưa từng đến.

Cái dòng màu đỏ phải bẫy lỗi thêm:
If Not dic2.exists(Cells(j, 1).Value) Then dic2.Add Cells(j, 1).Value, ""
Lý do, ví dụ tên Tuấn, dic1 sẽ có Tiền Giang - Huế.
dic2 add Hà Nội ở A2 và A6, trùng Key ---> Lỗi
 
Upvote 0
ồ anh thật là giỏi , xin anh chỉ cho em biết cách tuyệt vời của anh cho em học với }}}}}}}}}}

Bài này mình cũng viết được mà không cần dùng DIC mà:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C1")) Is Nothing Then


Range("C2:C50").ClearContents
Dim i, j, k As Long
Dim cll As Range, vung
Set vung = Range("D1")


[COLOR=#ff0000][B]' Phan 1: Tao ra danh sách các tỉnh mà người có tên ở C1 đã từng đi[/B][/COLOR]
[COLOR=#008000]'=============================================[/COLOR]
For i = 2 To 8
  If Cells(i, 2).Value = Cells(1, 3).Value Then
    Set vung = Union(Range("A" & i), vung)
  End If
Next i


[COLOR=#ff0000][B]'Phan 2 : Lấy những tỉnh ở cột A mà không có trong danh sách vừa tạo ra[/B][/COLOR]
[COLOR=#008000]'=====================================================[/COLOR]=
k = 2
For j = 2 To 8
  cou = 0
  For Each cll In vung
    If cll.Value = Cells(j, 1).Value Then
      cou = cou + 1
    End If
  Next cll
  If cou = 0 Then
   Cells(k, 3).Value = Cells(j, 1).Value
   k = k + 1
  End If
Next j

[COLOR=#ff0000][B]'Phân 3: Loại bỏ các giá trị trùng nhau để ra kết quả cuối cùng[/B][/COLOR]
[COLOR=#008000]'=======================================================[/COLOR]
Range("C2:C" & [C100].End(3).Row).RemoveDuplicates Columns:=1, Header:=xlNo
End If
End Sub

Nhưng vì nó hơi dài nên mình muốn chuyển qua dùng DIC cho ngắn hơn thôi
 
Lần chỉnh sửa cuối:
Upvote 0
Cái dòng màu đỏ phải bẫy lỗi thêm:
If Not dic2.exists(Cells(j, 1).Value) Then dic2.Add Cells(j, 1).Value, ""
Lý do, ví dụ tên Tuấn, dic1 sẽ có Tiền Giang - Huế.
dic2 add Hà Nội ở A2 và A6, trùng Key ---> Lỗi

Cám ơn thầy BATE ạ, nhờ thầy mách nước con đã biết cách khắc phục rồi:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) = "C1" Then
  Range("C2:C9").ClearContents
  Dim dic1 As Object, dic2 As Object, i As Long, j As Long
  Set dic1 = CreateObject("Scripting.Dictionary")
  Set dic2 = CreateObject("Scripting.Dictionary")
'========================================================
For i = 2 To 8
  If Cells(i, 2).Value = Cells(1, 3).Value Then
     dic1.Add Cells(i, 1).Value, ""
  End If
Next i
'========================================================
For j = 2 To 8
  If Not dic1.exists(Cells(j, 1).Value) And Not dic2.exists(Cells(j, 1).Value) Then
    dic2.Add Cells(j, 1).Value, ""
  End If
Next j
'==========================================================
  Range("C2").Resize(dic2.Count) = WorksheetFunction.Transpose(dic2.keys)
End If
End Sub

Cám ơn mọi người đã tham gia trả lời giúp em ạ ! Làm ra được cái zui thiệt á ...--=0--=0.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn chỉ cần key chứ không cần giá trị item, cho nên có thể dùng thẳng lệnh ghi trị cho key, thay vì add key. Như vậy không phải kiểm tra key có hay chưa. Nếu có rồi thì nó sửa item, nếu chưa thì nó thêm key vào.

If Not dic1.exists(Cells(j, 1).Value) Then dic2(Cells(j, 1).Value) = ""

Tuy nhiên, bài này nếu muốn dùng 2 đit thì tôi cũng chỉ đọc mảng 1 lần thôi, ghi cả 2 đít 1 lúc.
Sau đó dùng vòng lặp đọc từng phần tử bên đít 1 và trừ ra khỏi đít 2
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này mình cũng viết được mà không cần dùng DIC mà:
Mã:
Nhưng vì nó hơi dài nên mình muốn chuyển qua dùng DIC cho ngắn hơn thôi[/QUOTE]

bài này bạn có nhu cầu lọc duy nhất, xài dic là nhất rồi, 
xin lổi vì tôi đọc ko kỹ yêu cầu
nhưng vì lỡ nói ko xài dic, góp thêm bạn đoạn code cho vui
[code]
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim data As Variant
Dim result(1 To 8)
Dim i, k As Long
data = [a2:b8]
If Target.Address = "$C$1" Then
  For i = 1 To UBound(data)
    If data(i, 2) <> "" And data(i, 2) <> [c1] Then
    
            If TypeName(Application.Match(data(i, 1), result, 0)) = "Error" Then
                k = k + 1
                result(k) = data(i, 1)
            End If
   
    End If
Next
End If
  
 If k Then
  [c2:c8].ClearContents
  [c2].Resize(k) = Application.Transpose(result)
End If
End Sub
kè kè.......vẫn chưa ổn.......
 
Lần chỉnh sửa cuối:
Upvote 0
bài này bạn có nhu cầu lọc duy nhất, xài dic là nhất rồi,
xin lổi vì tôi đọc ko kỹ yêu cầu
nhưng vì lỡ nói ko xài dic, góp thêm bạn đoạn code cho vui
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim data As Variant
Dim result(1 To 8)
Dim i, k As Long
data = [a2:b8]
If Target.Address = "$C$1" Then
  For i = 1 To UBound(data)
    If data(i, 2) <> "" And data(i, 2) <> [c1] Then
    
            If TypeName(Application.Match(data(i, 1), result, 0)) = "Error" Then
                k = k + 1
                result(k) = data(i, 1)
            End If
   
    End If
Next
End If
  
 If k Then
  [c2:c8].ClearContents
  [c2].Resize(k) = Application.Transpose(result)
End If
End Sub
kè kè.......vẫn chưa ổn.......

Nếu tên tỉnh xảy ra trước tỉnh đi qua thì code này sai.

Bài này dùng 2 vòng lặp là đúng rồi. Dùng 1 vòng lặp cũng có thể được nhưng không giản dị như code trên đâu.
 
Upvote 0
Nếu tên tỉnh xảy ra trước tỉnh đi qua thì code này sai.

Bài này dùng 2 vòng lặp là đúng rồi. Dùng 1 vòng lặp cũng có thể được nhưng không giản dị như code trên đâu.

ra hàng xóm đánh cờ tướng, thua hoài, tức quá về viết code
nói chung là cho vui, chứ xài dic là tốt nhất
trong code này có lòng thêm một vòng lặp, cái này dùng mấy cái join, replace, split chắc cũng được
nhưng mà vợ bắt dọn dẹp nhà cửa, mệt quá.........hihihi
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim data, TP, Tng, kk As Variant
Dim i, k, J, ii As Long
Dim result(1 To 8), list(1 To 8)
data = [a2:b8]
If Target.Address = "$C$1" Then
  For i = 1 To UBound(data)
    If data(i, 2) <> "" Then
        kk = Application.Match(data(i, 1), result, 0)
        If data(i, 2) <> [c1] Then
            If TypeName(kk) = "Error" Then
                If TypeName(Application.Match(data(i, 1), list, 0)) = "Error" Then
                    k = k + 1
                    result(k) = data(i, 1)
                End If
            Else
            End If
        Else
            J = J + 1
            list(J) = data(i, 1)
            If TypeName(kk) <> "Error" Then
                For ii = kk To UBound(result) - 1
                    If result(ii) = "" Then Exit For
                    result(ii) = result(ii + 1)
                Next
                k = k - 1
            End If
        End If
    End If
Next
End If
  
 If k Then
  [c2:c8].ClearContents
  [c2].Resize(k) = Application.Transpose(result)
End If
End Sub
chúc bà con ăn tết vui
 
Lần chỉnh sửa cuối:
Upvote 0
ra hàng xóm đánh cờ tướng, thua hoài, tức quá về viết code
nói chung là cho vui, chứ xài dic là tốt nhất
trong code này có lòng thêm một vòng lặp, cái này dùng mấy cái join, replace, split chắc cũng được
nhưng mà vợ bắt dọn dẹp nhà cửa, mệt quá.........hihihi
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim data, TP, Tng, kk As Variant
Dim i, k, J, ii As Long
Dim result(1 To 8), list(1 To 8)
data = [a2:b8]
If Target.Address = "$C$1" Then
  For i = 1 To UBound(data)
    If data(i, 2) <> "" Then
        kk = Application.Match(data(i, 1), result, 0)
        If data(i, 2) <> [c1] Then
            If TypeName(kk) = "Error" Then
                If TypeName(Application.Match(data(i, 1), list, 0)) = "Error" Then
                    k = k + 1
                    result(k) = data(i, 1)
                End If
            Else
            End If
        Else
            J = J + 1
            list(J) = data(i, 1)
            If TypeName(kk) <> "Error" Then
                For ii = kk To UBound(result) - 1
                    If result(ii) = "" Then Exit For
                    result(ii) = result(ii + 1)
                Next
                k = k - 1
            End If
        End If
    End If
Next
End If
  
 If k Then
  [c2:c8].ClearContents
  [c2].Resize(k) = Application.Transpose(result)
End If
End Sub
chúc bà con ăn tết vui

ai biễu lấy vợ chi cho bị bắt dọn nhà , ha ha
xĩn có cách làm của người xĩn , ặc ặc

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cn As Object
If Target.Address = "$C$1" Then
    Set cn = CreateObject("adodb.connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & _
            ";Extended Properties=""Excel 12.0;HDR=NO;ReadOnly=True"";"
    Sheet1.Range("C2:C8").ClearContents
    Sheet1.Range("C2").CopyFromRecordset cn.Execute("select distinct b.f1 from (select * from [sheet1$A2:B8] " & _
    " where f2 = '" & Target.Value & "') a right join (select * from [sheet1$A2:B8]) b " & _
    " on a.f1 = b.f1 where a.f1 is null")
    cn.Close
    Set cn = Nothing
End If
End Sub
 
Upvote 0
ai biễu lấy vợ chi cho bị bắt dọn nhà , ha ha
xĩn có cách làm của người xĩn , ặc ặc

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cn As Object
If Target.Address = "$C$1" Then
    Set cn = CreateObject("adodb.connection")
    cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & _
            ";Extended Properties=""Excel 12.0;HDR=NO;ReadOnly=True"";"
    Sheet1.Range("C2:C8").ClearContents
    Sheet1.Range("C2").CopyFromRecordset cn.Execute("select distinct b.f1 from (select * from [sheet1$A2:B8] " & _
    " where f2 = '" & Target.Value & "') a right join (select * from [sheet1$A2:B8]) b " & _
    " on a.f1 = b.f1 where a.f1 is null")
    cn.Close
    Set cn = Nothing
End If
End Sub

cái này là hàng "xa xí phẩm" đối với mình rồi.........hihihiih
dòng lệnh này có nghĩa gì vậy đại ca?
Mã:
Sheet1.Range("C2").CopyFromRecordset cn.Execute("select distinct b.f1 from (select * from [sheet1$A2:B8] " & _
    " where f2 = '" & Target.Value & "') [COLOR=#ff0000]a right join (select * from [sheet1$A2:B8]) b " & _
    " on a.f1 = b.f1 where a.f1 is null")[/COLOR]
2 câu trên thì hiểu chọn duy nhất ở cột 1, chọn cột 2 bằng target.value, còn đoạn jion này thì ko hiểu
mong đai ca giải thích với
nếu hiểu sẻ đa tạ một bao lì xì của con tui nha...hhihihi
===========
đọc cứ như đọc bùa "bát quái"....hihihi
tức là lấy cột 1 ghép với cột 2, chổ nào mà nó có giá trị = ô C1
nhưng còn khúc cuối là gì?
on a.f1 = b.f1 where a.f1 is null"
 
Lần chỉnh sửa cuối:
Upvote 0
Bài này mình cũng viết được mà không cần dùng DIC mà:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("C1")) Is Nothing Then


Range("C2:C50").ClearContents
Dim i, j, k As Long
Dim cll As Range, vung
Set vung = Range("D1")


[COLOR=#ff0000][B]' Phan 1: Tao ra danh sách các tỉnh mà người có tên ở C1 đã từng đi[/B][/COLOR]
[COLOR=#008000]'=============================================[/COLOR]
For i = 2 To 8
  If Cells(i, 2).Value = Cells(1, 3).Value Then
    Set vung = Union(Range("A" & i), vung)
  End If
Next i


[COLOR=#ff0000][B]'Phan 2 : Lấy những tỉnh ở cột A mà không có trong danh sách vừa tạo ra[/B][/COLOR]
[COLOR=#008000]'=====================================================[/COLOR]=
k = 2
For j = 2 To 8
  cou = 0
  For Each cll In vung
    If cll.Value = Cells(j, 1).Value Then
      cou = cou + 1
    End If
  Next cll
  If cou = 0 Then
   Cells(k, 3).Value = Cells(j, 1).Value
   k = k + 1
  End If
Next j

[COLOR=#ff0000][B]'Phân 3: Loại bỏ các giá trị trùng nhau để ra kết quả cuối cùng[/B][/COLOR]
[COLOR=#008000]'=======================================================[/COLOR]
Range("C2:C" & [C100].End(3).Row).RemoveDuplicates Columns:=1, Header:=xlNo
End If
End Sub

Nhưng vì nó hơi dài nên mình muốn chuyển qua dùng DIC cho ngắn hơn thôi

Không dùng Dic, có thể so sánh chuỗi để làm.
Thất nghiệp làm thử:
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, K As Long, L As Long, DK As String, Tem As String
sArr = Range("A2:B8").Value
L = UBound(sArr)
DK = Range("C1").Value
ReDim dArr(1 To L, 1 To 1)
For I = 1 To L
    If sArr(I, 2) = DK Then Tem = Tem & "#" & sArr(I, 1)
Next I
For I = 1 To L
    If InStr(Tem, sArr(I, 1)) = 0 Then
        Tem = Tem & "#" & sArr(I, 1)
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
    End If
Next I
Range("C2").Resize(K) = dArr
End Sub
 
Upvote 0
Không dùng Dic, có thể so sánh chuỗi để làm.
Thất nghiệp làm thử:
PHP:
Public Sub GPE()
Dim sArr(), dArr(), I As Long, K As Long, L As Long, DK As String, Tem As String
sArr = Range("A2:B8").Value
L = UBound(sArr)
DK = Range("C1").Value
ReDim dArr(1 To L, 1 To 1)
For I = 1 To L
    If sArr(I, 2) = DK Then Tem = Tem & "#" & sArr(I, 1)
Next I
For I = 1 To L
    If InStr(Tem, sArr(I, 1)) = 0 Then
        Tem = Tem & "#" & sArr(I, 1)
        K = K + 1
        dArr(K, 1) = sArr(I, 1)
    End If
Next I
Range("C2").Resize(K) = dArr
End Sub
Cuối năm rồi, tui không muốn em "Đít-to" và chỉ chơi một vòng lặp thôi cho ......đỡ chóng mặt có được hông?????? _)()(-_)()(-_)()(-
CHÚC MỪNG NĂM MỚI (sớm tý tẹo)
 
Upvote 0
...
nhưng còn khúc cuối là gì?
on a.f1 = b.f1 where a.f1 is null"

Đó là cái mẹo để trừ phần tử của tập hợp B ra phỏi tập hợp A (tìm A - B). Thường thì người ta dùng Left Join, dễ hiểu hiơn Right Join.
Lý thuyết: nếu A left/Right join B thì kết quả sẽ gồm tất cả những phần tử A trong 2 trạng thái:
Những phần tử trong A và có trong B sẽ mang dữ liệu của B
Những phần tử trong A nhưng khong có trong B sẽ có phần tương ứng B là null (vì có đâu mà đưa ra)
Như vậy, trong cái kết quả left/right join này, nếu ta lượt ra những dòng có B là null thì sẽ được tập hợp A - B

Lưu ý rằng đây là mẹo tốc độ. Vì đối với tất cả phiên bản SQL, lệnh join thường là lệnh được xử lý rất nhanh.
Nếu làm theo đúng chuẩn thì thực ra SQL có lệnh NOT EXISTS để thực hiện tính trừ tập hợp.
(còn có 1 lệnh nữa là NOT IN)

Cuối năm rồi, tui không muốn em "Đít-to" và chỉ chơi một vòng lặp thôi cho ......đỡ chóng mặt có được hông?????? _)()(-_)()(-_)()(-
CHÚC MỪNG NĂM MỚI (sớm tý tẹo)

1 vòng lặp thì khá rắc rối cho nên có thể chóng mặt hơn.
Cụ thể 1 cách, tôi có thể đọc dữ liệu, nhét vào một chuỗi, đồng thời nhét phần ngoại lệ vào một mẫu RegEx
Sau khi hết vòng lặp tôi chỉ việc gọi RegEx ra replace mẫu.
 
Upvote 0
Đó là cái mẹo để trừ phần tử của tập hợp B ra phỏi tập hợp A (tìm A - B). Thường thì người ta dùng Left Join, dễ hiểu hiơn Right Join.
Lý thuyết: nếu A left/Right join B thì kết quả sẽ gồm tất cả những phần tử A trong 2 trạng thái:
Những phần tử trong A và có trong B sẽ mang dữ liệu của B
Những phần tử trong A nhưng khong có trong B sẽ có phần tương ứng B là null (vì có đâu mà đưa ra)
Như vậy, trong cái kết quả left/right join này, nếu ta lượt ra những dòng có B là null thì sẽ được tập hợp A - B

Lưu ý rằng đây là mẹo tốc độ. Vì đối với tất cả phiên bản SQL, lệnh join thường là lệnh được xử lý rất nhanh.
Nếu làm theo đúng chuẩn thì thực ra SQL có lệnh NOT EXISTS để thực hiện tính trừ tập hợp.
(còn có 1 lệnh nữa là NOT IN)


í anh Vetmini đã trúng bao lì xì của Let' Gâu Gâu kìa . hi hi
có lần em đã thay lệnh Join On where is null bởi lệnh Not IN và kết quả là từ đó em đã tự hứa với lòng sẽ dẹp lệnh NOT IN mãi mãi khỏi đầu óc ....
chúc anh Vetmini năm mới vui vẻ nha .
 
Upvote 0
Cách thứ 2, so sánh chuỗi và dùng 1 vòng lặp. Gọi các tỉnh là loại 1, các tỉnh đi qua là loại 2.
Vòng lặp đọc, nếu gặp loại 2 thì nhét vào chuỗi loại 2 và trừ ra khỏi chuỗi loại 1. Nếu gặp loại 1 thì xét xem nó có trong chuỗi loại 2, nếu không có thì nhét vào chuỗi loại 1.

Thực ra cách 2 tập dữ liệu chạy song song như thế này làm dic hay chuỗi đều được (như tôi đã có nói qua). Chỉ có phần trừ ra, được tô đỏ ở trên nó hơi rắc rối 1 chút.
 
Upvote 0
Cuối năm rồi, tui không muốn em "Đít-to" và chỉ chơi một vòng lặp thôi cho ......đỡ chóng mặt có được hông?????? _)()(-_)()(-_)()(-
CHÚC MỪNG NĂM MỚI (sớm tý tẹo)

Chưa tới năm con Khỉ, nhưng làm thí thí kiểu "Con Khỉ" cho "Đại Ca" "dzừa bụng".
PHP:
Public Sub GPE_2()
Application.ScreenUpdating = False
Dim Rng As Range, Cll As Range
Range("A2:A8").Offset(, 2).Value = Range("A2:A8").Value
Set Rng = Range("B2:B8")
For Each Cll In Rng
    If Cll.Value = Range("C1").Value Then Rng.Offset(, 1).Replace What:=Cll.Offset(, 1), Replacement:=""
Next
Rng.Offset(, 1).RemoveDuplicates Columns:=1
Rng.Offset(, 1).Sort Key1:=Range("C2") 'Híc! Hổng biết làm sao cho nó dồn lên dòng đầu'
Set Rng = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
í anh Vetmini đã trúng bao lì xì của Let' Gâu Gâu kìa . hi hi
có lần em đã thay lệnh Join On where is null bởi lệnh Not IN và kết quả là từ đó em đã tự hứa với lòng sẽ dẹp lệnh NOT IN mãi mãi khỏi đầu óc ....
chúc anh Vetmini năm mới vui vẻ nha .

Not In bị vấn đề khi dữ liệu có Null. Cách làm tôi muốn đưa ra nếu bảo đảm không có Null thì không sao cả.

From A where A.f1 NOT IN (select f1 From B where B.f2 = caiGiDo) -- nếu trong subquery có Null thì sẽ ra sai

From A where NOT EXISTS (select * From B where B.f1 = A.f1 And B.f2 = caiGiDo)
 
Upvote 0
Web KT
Back
Top Bottom