Truy vấn SQL gộp

Liên hệ QC

chipiu3001

Thành viên hoạt động
Tham gia
22/8/15
Bài viết
105
Được thích
15
Chào ace,
Mình có bảng dữ liệu như hình A
Ace giúp mình câu lệnh truy vấn SQL để ra kết quả như hình B.
Truy vấn theo dữ liệu đầu vào chỉ có Tên="B", nếu trong B có B1 thì sẽ lấy luôn dữ liệu của B1.
Mình cảm ơn nhiều.

1706854979095.png1706854997660.png
 
Lần chỉnh sửa cuối:
Chào ace,
Mình có bảng dữ liệu như hình A
Ace giúp mình câu lệnh truy vấn SQL để ra kết quả như hình B.
Truy vấn theo dữ liệu đầu vào chỉ có Tên="B", nếu trong B có B1 thì sẽ lấy luôn dữ liệu của B1.
Mình cảm ơn nhiều.

View attachment 298899View attachment 298900
Bạn thử coi coi có đúng chưa nha.

Mã:
Sub TruyVan()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;IMEX=1"""
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * From [Sheet1$] Where Ten Like 'B%'")
    End With
End Sub
Tái bút: Không file giả lập dữ liệu nên tui làm đại, còn lại bạn tự biến tấu nha hôn.
 
Chào ace,
Mình có bảng dữ liệu như hình A
Ace giúp mình câu lệnh truy vấn SQL để ra kết quả như hình B.
Truy vấn theo dữ liệu đầu vào chỉ có Tên="B", nếu trong B có B1 thì sẽ lấy luôn dữ liệu của B1.
Mình cảm ơn nhiều.

View attachment 298899View attachment 298900
Việc bố trí dữ liệu hơi kỳ kỳ rồi. Text và Number không nên lẫn vào nhau như thế.
 
Việc bố trí dữ liệu hơi kỳ kỳ rồi. Text và Number không nên lẫn vào nhau như thế.
Gửi bạn. cái đó chỉ là ví dụ thôi. Điền dữ liệu bất kỳ.
Mình đang làm theo 2 câu lệnh.
B1: Select mã hàng="A"
B2: Duyệt lần lượt DL ở cột Nguyên liệu xem có tồn tại ở cột Mã hàng không => Nếu có thì thêm gộp dữ liệu vào.
Yêu cầu của mình là: Select gộp 2 bước trên thành 1 câu lệnh truy vấn Select thôi.

Đầu vào chỉ có Mã hàng A
- Select Mã Hàng= "A" From bảng "Data"
Sẽ ra DL như hình B bao gồm mã hàng A và NVL con trong nó ( Nếu có).
Mình mong bạn giúp câu lệnh truy vấn select thôi nhé.
( Mình làm trên SQL server+VB.net)
1706859847264.png1706859852970.png
Bài đã được tự động gộp:

Bạn thử coi coi có đúng chưa nha.

Mã:
Sub TruyVan()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=""Excel 12.0 Xml;IMEX=1"""
        Sheet2.Range("A2").CopyFromRecordset .Execute("Select * From [Sheet1$] Where Ten Like 'B%'")
    End With
End Sub
Tái bút: Không file giả lập dữ liệu nên tui làm đại, còn lại bạn tự biến tấu nha hôn.
Bạn giúp mình như nội dung ở #4 nhé
 
Bạn theo logic này:

select *
from bang
where mahang = 'A'
or mahang in (select nguyenlieu from bang where mahang = 'A')
 
Bạn theo logic này:

select *
from bang
where mahang = 'A'
or mahang in (select nguyenlieu from bang where mahang = 'A')
Gửi bạn. Đã làm được.
Cảm ơn bạn nhiều
Bài đã được tự động gộp:

Gửi bạn. Đã làm được.
Cảm ơn bạn nhiều
select * from bang where mahang = 'A'
union all
select * from bang where mahang in (select nguyenlieu from bang where mahang = 'A')
Mình thấy câu lệnh này chạy nhanh hơn.
Mình viết sai cấu trúc nên nó không chạy. Theo như gợi ý của bạn thì mình làm nó chạy được rồi.
Cảm ơn nhé
 
Lần chỉnh sửa cuối:
Gửi bạn. Đã làm được.
Cảm ơn bạn nhiều
Bài đã được tự động gộp:


select * from bang where mahang = 'A'
union all
select * from bang where mahang in (select nguyenlieu from bang where mahang = 'A')
Mình thấy câu lệnh này chạy nhanh hơn.
Mình viết sai cấu trúc nên nó không chạy. Theo như gợi ý của bạn thì mình làm nó chạy được rồi.
Cảm ơn nhé
mình nghĩ nó phải chạy như nhau chứ nhỉ? bạn phải kiểm tra xem lúc bạn chạy thì server có chạy những cái khác không nữa, hoặc bạn thử cho bộ optimise nó so sánh 2 câu lệnh xem thế nào.
 
mình nghĩ nó phải chạy như nhau chứ nhỉ? bạn phải kiểm tra xem lúc bạn chạy thì server có chạy những cái khác không nữa, hoặc bạn thử cho bộ optimise nó so sánh 2 câu lệnh xem thế nào.
Khác nhau bạn ạ. Dữ liệu của mình cả triệu dòng.
Chạy 2 lệnh thì cảm nhận rõ bằng mắt chênh nhau khá lớn.
Mình ko dùng lệnh đo.
Bài đã được tự động gộp:

Mình có so sánh thời gian giữa 2 câu lệnh đây bạn. Union all nhanh hơn 20 lần.
1706864211932.png1706864221230.png
 
Lần chỉnh sửa cuối:
Khác nhau bạn ạ. Dữ liệu của mình cả triệu dòng.
Chạy 2 lệnh thì cảm nhận rõ bằng mắt chênh nhau khá lớn.
Mình ko dùng lệnh đo.
Bài đã được tự động gộp:

Mình có so sánh thời gian giữa 2 câu lệnh đây bạn. Union all nhanh hơn 20 lần.
View attachment 298904View attachment 298905
Bạn có thể chụp execution plan của cả 2 câu lệnh được không? cái này có thể do nó dùng plan khác nhau.
 
Đây bạn ơi.
"Không Union all" thấy có thêm bước Sort ( Distinct Sort) mất thời gian hơn. Chắc nguyên nhân là vậy.
(Nay mình thêm chỉ mục thì chạy như nhau nhìn bằng mắt thường. Nhưng đo thì nó vẫn chậm hơn hơn chục lần)

Không Union all
1706917906001.png
1706917505620.png

Có Union All
1706917920877.png
1706917649581.png
 
Web KT
Back
Top Bottom