2012-06-25 47 views
6

Tôi đang cố tạo truy vấn sql bằng dấu trừ.Toán tử trừ trong sql

Tôi có query1 trả về 28 dòng với 2 cột Tôi có query2 mà trả 22 row2 với 2 cột tương tự trong truy vấn 2.

khi tôi tạo một truy vấn query1 truy vấn trừ 2 cần có chỉ hiển thị 28 -22 = 6 hàng. Nhưng nó hiển thị tất cả 28 hàng trả về bởi truy vấn1.

Vui lòng thông báo.

+0

Bạn đang nhắm mục tiêu cơ sở dữ liệu nào? Tôi đã từng sử dụng 'trừ' trên oracle, cá nhân. Tôi biết nó không nghiêm chỉnh tồn tại trong hình thức này trên Sql Server, ví dụ. – dwerner

+0

Đăng truy vấn của bạn và một số dữ liệu ví dụ từ cả hai mặt của dấu trừ? –

+0

(Giả sử oracle) Để 'trừ' hoạt động, toàn bộ hàng phải khớp chính xác. – dwerner

Trả lời

1

một cái gì đó như thế này:

select field1, field2, . field_n 
from tables 
MINUS 
select field1, field2, . field_n 
from tables; 
+0

cũng thấy http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=115930 – compcobalt

6

Nếu TRỪ sẽ không làm việc cho bạn, hình thức chung bạn muốn là truy vấn chính trong các lựa chọn bên ngoài và một biến thể của các truy vấn khác trong một không tồn tại điều khoản.

select <insert list of fields here> 
from mytable a 
join myothertable b 
on b.aId = a.aid 
where not exists (select * from tablec c where a.aid = c.aid) 
2

Các trường có thể không hoàn toàn giống nhau. có thể là một trong các trường là char (10) và một là char (20) và cả hai đều có chuỗi "TEST" trong chúng. Họ có thể "nhìn" giống nhau.

Nếu cơ sở dữ liệu bạn đang làm việc hỗ trợ "INTERSECT", hãy thử truy vấn này và xem có bao nhiêu kết quả phù hợp hoàn hảo.

select field1, field2 from table1 
intersect 
select field1, field2 from table2 

Để nhận được kết quả bạn mong đợi, truy vấn này sẽ cung cấp cho bạn 22 hàng.

+1

OP đang tìm 6 hàng, không phải 22 (giả sử 26 là lỗi đánh máy). – leppie

+1

Nếu 22 hàng là phổ biến trong truy vấn 1 và truy vấn 2, thì truy vấn MINUS sẽ cung cấp 6 hàng không phổ biến cho cả hai hàng. Câu trả lời của tôi là xác nhận rằng dữ liệu như OP mong đợi. –

+1

Một lần nữa bạn có nghĩa là 22, phải không? ; p – leppie

10

Thử sử dụng EXCEPT thay vì MINUS. Ví dụ: Cho phép xem xét một trường hợp mà bạn muốn tìm hiểu nhiệm vụ nào trong bảng chưa được gán cho bạn (Vì vậy, về cơ bản bạn đang cố gắng tìm những tác vụ nào có thể có sẵn để làm).

SELECT TaskID, TaskType 
FROM Tasks 
EXCEPT 
SELECT TaskID, TaskType 
FROM Tasks 
WHERE Username = 'Vidya' 

Điều đó sẽ trả lại tất cả các tác vụ chưa được chỉ định cho bạn. Hy vọng rằng sẽ giúp.

1

MINUS hoạt động trên nguyên tắc tương tự như trong hoạt động đã đặt. Giả sử nếu bạn đã đặt A và B, A = {1,2,3,4}; B = {3,5,6} sau đó, AB = {1,2,4}

Nếu A = {1,3,5} và B = {2,4,6} sau đó, AB = {1,3,5}. Ở đây, số đếm (A) trước và sau thao tác MINUS sẽ giống nhau, vì nó không chứa bất kỳ cụm từ chồng chéo nào với tập hợp B.

Trên các dòng tương tự, có thể là kết quả thu được trong truy vấn 2 có thể không khớp các thuật ngữ với kết quả của truy vấn1. Do đó bạn vẫn nhận được 28 thay vì 6 hàng.

Hy vọng điều này sẽ hữu ích.

1

Nó trả về các bản ghi khác biệt trong truy vấn phía trên không được truy vấn thứ hai chứa.

Trong trường hợp của bạn ví dụ A = {1,2,3,4,5 ... 28} VÀ B = {29,30} thì AB = {1,2,3 .... 28}

Các vấn đề liên quan