2012-04-24 33 views
7

Nếu tôi gõ:Chọn giá trị từ một bảng mà không phải là trong một SQL danh sách

SELECT name FROM table WHERE name NOT IN ('Test1','Test2','Test3'); 

tôi có thể nhận thông tin nhập từ bàn mà không phải là trong danh sách. Tôi muốn làm ngược lại: Lấy các giá trị từ danh sách không có trong bảng. Ví dụ, nếu bảng có một cột tên có giá trị 'Test1' và 'Test3' tôi muốn so sánh với ('Test1', 'Test2', 'Test3') và trả về Test2. Hoặc làm ví dụ khác, nếu bảng trống, sau đó trả về mọi thứ trong danh sách: Test1, Test2 và Test3.

Có cách nào để thực hiện việc này KHÔNG tạo bảng mới với tất cả các giá trị trong danh sách không?

+0

cơ sở dữ liệu gì bạn đang sử dụng (oracle? Sql máy chủ?) – aquinas

+0

Tôi đang sử dụng sqlite3. – Trinculo

Trả lời

7

Tùy thuộc vào số lượng giá trị bạn có, bạn có thể thực hiện một vài công đoàn.

Xem: http://www.sqlfiddle.com/#!5/0e42f/1

select * from (
    select 'Test 1' thename union 
    select 'Test 2' union 
    select 'Test 3' 
) 
where thename not in (select name from foo) 
+2

Dịch vụ tuyệt vời của sqlfiddle – Anton

+2

Tôi đã khám phá ra nó ngày hôm qua. Nó khá trơn. – aquinas

+0

Cảm ơn aqunias, giải pháp của bạn hoạt động tốt. – Trinculo

0

Giả sử "othertable" giữ bảng trong câu hỏi ...

select a.value from 
    (select 'test1' value 
    union 
    select 'test2' value 
    union 
    select 'test3' value) a 
     left outer join othertable b 
     on a.value=b.value 
     where b.value is null 
1

Tôi thường sử dụng SELECT 'FOO' AS COL UNION SELECT 'BAR' vv và sau đó sử dụng thành ngữ tiêu chuẩn gia nhập trái và kiểm tra NULL để tìm các phần tử bị thiếu.

CREATE TABLE #YourTable(
name nvarchar(50) 
) 

insert into #YourTable (name) values ('Test1'), ('Test3') 

-- ALL 
select * from #YourTable 

--MISSING 
select t1.* from (
    select 'Test1' testName 
    union select 'Test2' 
    union select 'Test3') as t1 
    left outer join #YourTable yt on t1.testName = yt.name 
    where yt.name is null 

DROP TABLE #YourTable 

Cung cấp đầu ra

name 
-------------------------------------------------- 
Test1 
Test3 

(2 row(s) affected) 

testName 
-------- 
Test2 

(1 row(s) affected) 
1
Select a.value from (
SELECT 'testvalue' value UNION 
SELECT 'testvalue2' value UNION 
SELECT 'testvalue3' value UNION 
SELECT 'testvalue4' value UNION 
) a 
left outer join othertable b 
on a.value=b.value 
where b.value is null 

này là hoàn hảo cho vấn đề của tôi mà không cần bảng temp #

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