Access

Liên hệ QC
Dù thông tin cực kỳ nghèo nàn nhưng thấy mấy câu đố quá lạ nên thử sức tý trước khi topic có thể bị mấy bác cờ đỏ nhiệt tình quăng vô sọt.
Câu 4 đại loại như thế này (tác giả topic tự biến đổi theo tên bảng, tên cột tương ứng nhá :whistling:):
SQL:
UPDATE Products INNER JOIN Orders ON Products.ID = Orders.Product SET Orders.Price = [Products].[Price];
Cám ơn công cụ QBE vì trước giờ không hình dung INNER JOIN đưa vô UPDATE QUERY ngọt thế nhưng hôm nay đã được biết (chắc do ngu chuyên nghiệp :vava:)

Còn câu 5 chả hiểu nghĩa là gì nên đành bỏ qua.
 
Lần chỉnh sửa cuối:
Hình như đối với Access thì Update chỉ dùng được qua Join thôi.
Access không hoàn toàn theo chuẩn SQL (-92) cho nên không chấp nhận subquery trả về 1 trị.
Cách khác là dùng hàm DLookup.

Chú: thầy/cô gì ra bài tập này dỏm bỏ bố.
Ai đời update giá hợp đồng mà không ghi ngày tháng, hay tối thiểu đánh dấu đã ghi giá. Chả nhẽ mỗi lần hàng đổi giá thì hợp đồng đổi giá theo? Ghi nhầm giá thì lấy gì kiểm soát? Không biết mần ăn buôn bán thì làm cái khác, ví dụ CSDL nhân viên chẳng hạn.
 
Hình như đối với Access thì Update chỉ dùng được qua Join thôi.
Access không hoàn toàn theo chuẩn SQL (-92) cho nên không chấp nhận subquery trả về 1 trị.
Cháu mới thử kiểm tra syntax (dùng cho SQL nói chung và mySQL nói riêng) thì thấy chỉ báo lỗi ở dấu ngoặc []. Bỏ cái đó đi là chạy phà phà :whistling:

Dựa vào những tài liệu ra đời từ hơn chục năm trước thì thấy cú pháp như thế sai. Nhưng SQL bây giờ cải tiến và các hệ CSDL học hỏi lẫn nhau rồi. Lúc trước cũng có nhu cầu những câu lệnh như vậy nhưng cứ tưởng là không thể, nhờ cái bài tập mới biết là tồn tại khả năng ấy. Cũng phải cám ơn ông nào ra cái đề đó. Chỉ sợ nhất là lúc chấm bài người ta không chấp nhận syntax mới :unknw:
 
Lần chỉnh sửa cuối:
Cháu mới thử kiểm tra syntax (dùng cho SQL nói chung và mySQL nói riêng) thì thấy chỉ báo lỗi ở dấu ngoặc []. Bỏ cái đó đi là chạy phà phà :whistling:
...
Update qua Join là căn bản. Mọi phiên bản SQL đều dùng.
Bằng subquery (correlaled subquery) như sau thì chỉ SQL chuẩn mới được. SQL Server và mySQL theo chuẩn chỗ này, Access không chấp nhận.
Update A Set A.Field1 = (Select Max(B.Field1) From B Where B.Key1 = A.Key1)
SQL Server và MySQL biết Max(...) là một trị scalar. Access cho rằng cứ kết quả của 1 subquery thì không phải là scalar.

Bài #4 tôi nói rằng đối với Access thì Update với Join có lẽ là cách duy nhất, nếu không dùng hàm DLookup.
UPDATE A SET A.Field1 = DLookUp("A.[Field1]","B","B.Key1 = A.Key1")

... Chỉ sợ nhất là lúc chấm bài người ta không chấp nhận syntax mới :unknw:
Người ra đề này tương đối cẩu thả - gõ còn sai chính tả (câu 5 và 6).
Người chấm bài có thể không đủ tự tin để phân biệt ngữ pháp mới cũ.
 
Lần đầu tiên dùng DLOOKUP, vật vã lắm cháu mới chỉnh đúng được cú pháp UPDATE chú VetMini gợi ý
SQL:
UPDATE Orders SET Orders.Price = DLookUp("Price","Products","Products.ID = " & Orders.Product);
Có thế này chú viết toẹt luôn ra thì cháu đỡ khổ biết mấy :cray:

Năng lực có hạn nên cháu cũng không hiểu hay quan tâm những khái niệm hàn lâm mà chú nói.
  1. Cháu tạo ra câu UPDATE theo INNER JOIN theo tư duy tự nhiên (vì cũng chưa giải được tình huống này bao giờ) cùng với sự giúp đỡ QBE mà không tra Google luôn.
  2. Khi xem cú pháp sử dụng Dlookup thì cháu dự cảm rằng tốc độ theo phương pháp của chú sẽ rất chậm nếu gặp số dòng tương đối nhiều bởi lẽ mỗi lần set 1 dòng bên Orders thì Dlookup sẽ phải tra cứu lại từ đầu đến lúc tìm được bên bảng tra cứu Products.
Và thực tế đúng như cháu dự đoán. Dưới đây là so sánh tốc độ thực thi của 2 phướng án với Products (bảng tra) [11 dòng] và Orders [50000 dòng]
  • 11/30/2018 7:49:43 PM : 11/30/2018 7:49:44 PM [INNER JOIN - 1 giây]
  • 11/30/2018 7:49:44 PM : 11/30/2018 7:50:12 PM [DLOOKUP - 28 giây]
Hoán đổi trình tự kiểm nghiệm:
  • 11/30/2018 7:58:52 PM : 11/30/2018 7:59:21 PM [DLOOKUP - 29 giây]
  • 11/30/2018 7:59:21 PM : 11/30/2018 7:59:22 PM [INNER JOIN - 1 giây]
Phương án INNER JOIN chỉ tốn chưa đầy 1 giây (trong thực tế) còn phương pháp DLOOKUP mất khoảng 29 giây. Có lẽ DLOOKUP chỉ áp dụng vô những bài tập hoặc ứng dụng có số dòng tương đối ít hoặc dùng trên những máy chủ siêu tốc độ nên chưa lộ nhược điểm.

Ở đây bảng tra cứu chỉ có 11 dòng, nếu tăng lên vài trăm hoặc vài vạn như thực tế có lẽ DLOOKUP có thể làm hệ thống bế tắc :fool:. Đôi khi dốt cũng có chút may mắn vì nếu biết dùng hàm DLOOKUP thì chắc gì quen với em INNER JOIN sung sức thế này --=0
 
Lần chỉnh sửa cuối:
Dù thông tin cực kỳ nghèo nàn nhưng thấy mấy câu đố quá lạ nên thử sức tý trước khi topic có thể bị mấy bác cờ đỏ nhiệt tình quăng vô sọt.
Câu 4 đại loại như thế này (tác giả topic tự biến đổi theo tên bảng, tên cột tương ứng nhá :whistling:):
SQL:
UPDATE Products INNER JOIN Orders ON Products.ID = Orders.Product SET Orders.Price = [Products].[Price];
Cám ơn công cụ QBE vì trước giờ không hình dung INNER JOIN đưa vô UPDATE QUERY ngọt thế nhưng hôm nay đã được biết (chắc do ngu chuyên nghiệp :vava:)

Còn câu 5 chả hiểu nghĩa là gì nên đành bỏ qua.
Dù thông tin cực kỳ nghèo nàn nhưng thấy mấy câu đố quá lạ nên thử sức tý trước khi topic có thể bị mấy bác cờ đỏ nhiệt tình quăng vô sọt.
Câu 4 đại loại như thế này (tác giả topic tự biến đổi theo tên bảng, tên cột tương ứng nhá :whistling:):
SQL:
UPDATE Products INNER JOIN Orders ON Products.ID = Orders.Product SET Orders.Price = [Products].[Price];
Cám ơn công cụ QBE vì trước giờ không hình dung INNER JOIN đưa vô UPDATE QUERY ngọt thế nhưng hôm nay đã được biết (chắc do ngu chuyên nghiệp :vava:)

Còn câu 5 chả hiểu nghĩa là gì nên đành bỏ qua.
Bạn ơi thật ra mình cũng muốn hiểu bạn nói cái gì lắm... mà năng lực có hạn thành ra vẫn không hiểu. Bạn nói rỏ hơn tí dùm mình được không?
 
JOIN là cái cốt của SQL. Từ lúc CSDL LH (Relational Database) được Codd hình tượng qua lý thuyết tập hợp (Set theory) thì phép giao (Intersection - SQL gọi là Join) đã nghiễm nhiên trở thành cái cầu Liên Hệ giữa các bảng.
Vì vậy, bất cứ phần mềm nào hổ trợ SQL đều phải chú ý vào Join và thiết kế sao cho phép Join hoạt động thật hiệu quả.
Nói cách khác, nếu có sự so sánh giữa các lệnh SQL, và nhất là khi trường liên hệ được Index thì bạn có thể đem cả sinh mạng mình ra mà cược (bet your own ass) rằng Join là cái chạy nhanh nhất.

Chú: tất cả các hàm D* của Access đều không cốt ý viết cho tốc độ. D ở đây là "Domain" chứ không phải "Database".
 
Bạn ơi thật ra mình cũng muốn hiểu bạn nói cái gì lắm... mà năng lực có hạn thành ra vẫn không hiểu. Bạn nói rỏ hơn tí dùm mình được không?
Tôi có làm 2 cái đáp án query UPDATE đó. Chọn 1 cái rồi thay đổi tên bảng (trong bài tập bảng tên gì?) là xong chứ có khó gì đâu.:rolleyes:

Thấy chú VetMini toàn đề cập lý thuyết chính quy nên không rõ trước đây chú có dùng UPDATE với INNER JOIN không ạ? Còn cháu thì kiến thức sách vở về SQL gói gọn chỉ đúng 2/3 cuốn Access photo hệ B thôi, đâm ra hay làm đại lắm miễn sao nó ra được là mừng :hands:

File minh họa sơ sài nên các chú hay anh chị cũng đừng săm soi chuẩn này nọ quá ạ.
 

File đính kèm

  • Test.zip
    279.4 KB · Đọc: 3
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom