2012-11-08 10 views
5

Giả sử tôi có bảng có tên tbl_med, có sáu trường: [nom_lab], [nom_desc], [nom_apres], [date_vig], [cod_med], [vr_pmc ].Tôi muốn hiểu truy vấn do Microsoft Access tạo theo hướng dẫn

Tôi muốn một truy vấn SQL MS Access rằng sẽ:

  1. Tìm hồ sơ trùng lặp liên quan đến bốn lĩnh vực: [nom_lab], [nom_desc], [nom_apres], [date_vig].
  2. Hiển thị tất cả sáu trường (không chỉ các trường đang được sử dụng để kiểm tra trùng lặp).

tôi đã sử dụng MS Access "Find Duplicates Query Wizard", mà đã cho tôi SQL sau:

SELECT tbl_med.[nom_lab], tbl_med.[nom_desc], tbl_med.[nom_apres], tbl_med.[date_vig], tbl_med.[cod_med], tbl_med.[vr_pmc] 
FROM tbl_med 
WHERE tbl_med.[nom_lab] 
IN 
(
    SELECT [nom_lab] 
    FROM [tbl_med] As Tmp 
    GROUP BY [nom_lab], [nom_desc], [nom_apres],[date_vig] 
    HAVING Count(*)>1 

And [nom_desc] = [tbl_med].[nom_desc] 
    And [nom_apres] = [tbl_med].[nom_apres] 
    And [date_vig] = [tbl_med].[date_vig] 

) 
ORDER BY tbl_med.[nom_lab], tbl_med.[nom_desc], tbl_med.[nom_apres], tbl_med.[date_vig]; 

bất cứ ai có thể giải thích lý do tại sao ba Các điều kiện And giữa các đường quy tắc ngang ở trên có cần thiết không?

Có ai có truy vấn trực quan hơn dễ hiểu hơn không?

+4

Chúng cần thiết vì truy vấn phải tham chiếu về phiên bản tổng của chính nó để xác định xem số lượng bản ghi có lớn hơn 1 hay không, do đó trùng lặp. Tôi khuyên bạn nên gắn bó với trình hướng dẫn cho các hàng đợi thuộc loại này. –

Trả lời

1

Về cơ bản, ba And khoản đang có bởi vì bạn nói với trình hướng dẫn truy vấn mà bạn muốn kiểm tra các bản sao không chỉ trên lĩnh vực [nom_lab], mà còn trên [nom_desc], [nom_apres], và [date_vig] lĩnh vực (như bạn đã nêu ở phần đầu về câu hỏi của bạn).

Phần SELECT [nom_lab] FROM [tbl_med] As Tmp ... HAVING Count(*)>1 của truy vấn phụ yêu cầu ứng dụng tìm kiếm các bản ghi có giá trị trùng lặp [nom_lab]. Các điều khoản And sau đó đáp ứng phần còn lại của tiêu chí trùng lặp được yêu cầu của bạn bằng cách nói có hiệu lực "ngoài việc có các giá trị trùng lặp [nom_lab], tôi muốn chỉ xem các bản ghi cũng có bản sao trong cả ba trường này ([nom_desc], [nom_apres][date_vig]) cũng."

Vì vậy, để trả lời câu hỏi thứ hai của bạn, tôi thực sự không thể thấy cách bạn có thể ép buộc nó trực quan hơn. SQL chỉ là một ngôn ngữ phức tạp để thỉnh thoảng có thể sử dụng ngôn ngữ của bạn, và giống như bất kỳ ngôn ngữ nào (cho dù đó là ngôn ngữ lập trình hay ngôn ngữ nói) cần có thời gian để tìm hiểu các mẫu và sắc thái của nó trước khi bạn cảm thấy thoải mái khi đọc nó một cách dễ dàng.