Query is too complex - cách khắc phục? (3 người xem)

  • Thread starter Thread starter larita
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

larita

Thành viên mới
Tham gia
9/5/10
Bài viết
4
Được thích
0
Chào các bạn. Mình trường hợp cần sự hỗ trợ của các bạn. Trong access, mình có 1Table(Data) gồm có 7field (A1_1 cho den A1_7). Dữ liệu lưu trong đó gồm từ 1 đến 17 và 999. Mình có viết câu query để tính số TOTAL xem trong có bao nhiêu record. Nhưng ngặt cái là access cứ báo lỗi Query too max complex. Các bạn xem có cách nào khắc phục hay có cách nào viết khác hay không?
Do không tải file access lên được mình đưa data ra Excel và câu Query o file text.
Thanks,
 

File đính kèm

Nếu điều kiện của bạn liên quan đến 1 dãy số liên tục thì bạn nên so sánh với 2 cận đầu và cuối là đủ, còn nếu không liên tục thì bạn có thể thay OR bằng IN
Mã:
SELECT Count(*) AS V
FROM DATA
WHERE A1_1 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999) 
OR A1_2 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999)
OR A1_3 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999)
OR A1_4 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999)
OR A1_5 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999)
OR A1_6 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999)
OR A1_7 IN(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,999)
 
Có 1 cách khác, theo dữ liệu mẫu:
Mã:
SELECT count(*) As V 
FROM DATA
where A1_1 <18 or A1_1 = 999 or 
A1_2 <18 or A1_2 = 999 or 
A1_3 <18 or A1_3 = 999 or 
A1_4 <18 or A1_4 = 999 or 
A1_5 <18 or A1_5 = 999 or 
A1_6 <18 or A1_6 = 999 or
A1_7 <18 or A1_7 = 999;
 
Nếu:
- Dữ liệu không có gì khác ngoài 1 - 17 và 999
- Cấu trúc table đã set default value cho mọi trường đều bằng 0 (mặc định của trường số), nghĩa là mọi fields không có số liệu đều bằng 0.

Chỉ cần thế này:
Mã:
SELECT Count(*) AS V
FROM DATA
WHERE [A1_1]+[A1_2]+[A1_3]+[A1_4]+[A1_5]+[A1_6]+[A1_7]>0;
 
Thanks các bạn đã hướng dẫn. Mình sẽ cố gắng áp dụng các cách của bạn trong những trường hợp để kết quả tốt nhất.
 
Hãy xem các giả thiết cho yêu cầu này.

Bạn nói các field có dữ liệu từ 1 đến 17 và 999, thì đếm xem có bao nhiêu record, có nghĩa là có bao nhiêu dòng. Vấn đề đặt ra là:
1. Nếu có 1 field không có dữ liệu hoặc dữ liệu là 0 thì có tính là 1 record hay không?
2. Nếu không có field nào có dữ liệu hoặc có dữ liệu bằng 0 thì xử lý thế nào?
3. Các field có được giới hạn giá trị nhập liệu không ? (nghĩa là chỉ có thể nhập từ 1 đến 17 hoặc 999 thôi)

Các cú pháp của các bài trước đều cho kết quả là số dòng trong bảng tính, tương đương:
SELECT Count(*) AS V
FROM DATA

Nếu các giả thiết 1 và 2 ở trên được đề cập thì thêm điều kiện loại trừ vào.
 
Hãy xem các giả thiết cho yêu cầu này.

Bạn nói các field có dữ liệu từ 1 đến 17 và 999, thì đếm xem có bao nhiêu record, có nghĩa là có bao nhiêu dòng. Vấn đề đặt ra là:
1. Nếu có 1 field không có dữ liệu hoặc dữ liệu là 0 thì có tính là 1 record hay không?
2. Nếu không có field nào có dữ liệu hoặc có dữ liệu bằng 0 thì xử lý thế nào?
3. Các field có được giới hạn giá trị nhập liệu không ? (nghĩa là chỉ có thể nhập từ 1 đến 17 hoặc 999 thôi).

1 dòng không trống là 1 record. Ở đây có field rec_ID là trường khoá nên lúc nào cũng có giá trị. Vậy số record trong bảng tính đồng thời cũng là table của Access là 641.
(Nhớ lại đây là hỏi về table trong Access.)

Các cú pháp của các bài trước đều cho kết quả là số dòng trong bảng tính, tương đương:
SELECT Count(*) AS V
FROM DATA
Không tương đương. Các câu lệnh select ở các bài bài trên cho ra kết quả 634, câu lệnh Select của Solomon ra kết quả 641.

Nếu các giả thiết 1 và 2 ở trên được đề cập thì thêm điều kiện loại trừ vào.
Giả thiết 1 và 2 không cần đề cập, vì field Rec_ID lúc nào cũng có dữ liệu.
Riêng giả thiết 3 cần đề cập như trong bài #4 cộng với giả thiết (4): Mặc định field không gõ gì vào có giá trị 0. Hai giả thiết này thoả mới dùng câu lệnh SQL của bài #4 được.

(không giống excel, Access mà không có giả thiết (4) này thì Sum = 0 cho dù trong 7 field có đến 6 field có dữ liệu.)
 
Một giả định khác:
Lỡ người ta buồn buồn thêm một cái điều kiện nữa cho một hoặc vài field thôi, thì chắc phải viết lại câu lệnh SELECT?

Một lưu ý:
Với SELECT, việc COUNT(*) nên hạn chế sử dụng, mà bạn nên sử dụng COUNT(field_name) cụ thể. Vấn đề vì sao thì những người sử dụng SQL Server sẽ biết rất rõ.
 
Web KT

Bài viết mới nhất

Back
Top Bottom