2012-11-07 33 views
5

Tôi đang làm việc trên một dự án và tôi có danh sách vài nghìn bản ghi mà tôi cần kiểm tra. Tôi cần cung cấp danh sách những thứ KHÔNG tìm thấy và cung cấp truy vấn tôi sử dụng để định vị chúng để cấp trên của tôi có thể kiểm tra công việc của họ.Trả lại các giá trị không tìm thấy trong truy vấn

Tôi sẽ thừa nhận tôi khá mới đối với SQL. Tôi không có quyền truy cập để tạo ra các bảng tạm thời, đó là một cách tôi đã nghĩ đến để làm điều này.

Một ý tưởng cơ bản của những gì tôi đang làm:

select t.column1, t.column2 
from table1 t 
where t.column1 in ('value1','value2','value3') 

Nếu value1 và value3 đang ở trong cơ sở dữ liệu, nhưng value2 không phải là, tôi cần phải hiển thị value2 và không phải là người khác.

Tôi đã thử ISNULL, nhúng truy vấn và cố gắng chọn NOT giá trị từ truy vấn.

Tôi đã tìm kiếm các bản ghi trả lại không tìm thấy trong truy vấn trên Google và trên trang web này, nhưng vẫn không tìm thấy gì.

+0

Bạn có thể tạo gì trên máy chủ đầy đủ các bảng, lượt xem, quy trình lưu trữ, ..? loại sql là nó? – Jester

+0

Không "chọn t.column1, t.column2 từ table1 t trong đó t.column1 NOT in ('value1', 'value2', 'value3')" hoạt động cho bạn? Nếu bạn chỉ có hàng ngàn mục, bạn có thể đặt chúng vào một danh sách như thế. –

Trả lời

0

giải pháp có thể hoạt động ở Oracle trong đó hai là một hàng cột đơn. Bạn cần một bảng nơi bạn có thể chọn ảo các giá trị mong muốn!

CẢNH BÁO vì tôi không có quyền truy cập vào db Tôi chưa bao giờ thử nghiệm truy vấn bên dưới.

SELECT tab_all.col_search, t.column1, t.column2 
FROM 
(
    Select value1 AS col_search from dual 
    union all 
    Select value2 from dual 
    union all 
    Select value3 from dual 
) tab_all left join table1 t 
on col_search = t.column1 
WHERE t.column1 is null; 

I belive SQLServer tương đương với Oracle CHỌN value1 TỪ kép là CHỌN value1 hoặc chọn 'value1'.

Vì vậy, cố gắng

SELECT tab_all.col_search, t.column1, t.column2 
FROM 
(
    Select value1 AS col_search 
    union all 
    Select value2 AS col_search 
    union all 
    Select value3 AS col_search 
) tab_all left join table1 t 
on col_search = t.column1 
WHERE t.column1 is null; 

Như Tôi không phải là người sqlserver có thể là RichardTheKiwi phiên bản của chọn của Oracle từ kép là tốt hơn.

+0

Đủ công bằng, đó là SQL Server 2008 R2. Tôi nên có quy định chúng tôi bị giới hạn trong T-SQL. Tôi khá hạn chế chỉ chọn, cập nhật, chèn và xóa, tôi không thể truy cập các thủ tục được lưu trữ (mặc dù tôi đã tìm thấy các cách xung quanh), không thể tạo các khung nhìn hoặc bảng. –

2

Tôi đã thử một cái gì đó tương tự:

Trước tiên hãy tạo một bảng chứa tất cả các giá trị bạn cần.

phép nói

create table table_values(values varchar2(30)); 

sau đó thử tại khoản như sau:

select * from table_values tv where tv.value not in (select t.column1 
from table1 t); 

này sẽ trở lại với các giá trị cần thiết.

+0

Trong bài đăng đầu tiên, ông đã đề cập không có bảng tmp! – elrado

1

Trong SQL Server 2008, bạn có thể tạo các bảng dẫn xuất bằng cú pháp VALUES(...)(...)(...), ví dụ:

select v.value 
     from (
      values ('value1'),('value2'),('value3') 
      ) v(value) 
left join table1 t on t.column1 = v.value 
    where t1.column1 is null 

Ghi chú:

  1. Mỗi (...) sau GIÁ TRỊ là một hàng duy nhất, và bạn có thể có nhiều cột.
  2. v(value) sau bảng dẫn xuất là bí danh được cung cấp cho bảng và (các) tên cột.
  3. LEFT JOIN giữ các giá trị từ các bảng có nguồn gốc v ngay cả khi các hồ sơ không tồn tại trong table1
  4. Sau đó, chúng tôi tiếp tục chỉ các hồ sơ mà không thể được xuất hiện, tức là t1.column1 is null
  5. tôi đã chuyển sang cột đầu tiên trong lựa chọn của bạn đến cột từ v. cột 2 bị xóa vì nó luôn là rỗng
Các vấn đề liên quan