2012-11-07 12 views
5

Pracuję nad projektem i mam listę kilku tysięcy rekordów, które muszę sprawdzić. Muszę podać listę tych, które NIE zostały znalezione, i podać zapytanie, którego używam, aby je zlokalizować, aby moi przełożeni mogli sprawdzić swoją pracę.Powracanie nie znaleziono wartości w zapytaniu

Przyznam, że jestem względnie nowy w SQL. Nie mam dostępu do tworzenia tabel tymczasowych, co jest jednym ze sposobów, w jaki myślałem o tym.

Podstawowa idea tego, co robię:

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

Jeśli wartosc1 i wartość3 są w bazie danych, ale value2 nie jest, trzeba wyświetlić wartość2, a nie innych.

Próbowałem ISNULL, osadzanie kwerendy i próby wybrania wartości NOT z kwerendy.

Szukałem powracających rekordów nie znaleziono w zapytaniu w Google i na tej stronie, i nadal nic nie znalazłem.

+0

Co można utworzyć na serwerze pełne tabele, widoki, procedura składowania, ..? jaki to jest typ sql? – Jester

+0

Czy "wybierz t.kolumny1, t.kolumny2 z tabeli 1 t gdzie t.kolumna1 NIE (" wartość1 "," wartość2 "," wartość3 ")" działa dla Ciebie? Jeśli masz tylko tysiące przedmiotów, możesz umieścić je na takiej liście. –

Odpowiedz

0

rozwiązanie może działać w Oracle, gdzie dual jest pojedynczym wierszem tabeli pojedynczej kolumny. Potrzebujesz jednej tabeli, w której możesz dokonać wirtualnego wyboru żądanych wartości!

OSTRZEŻENIE, ponieważ nie mam dostępu do bazy danych Nigdy nie testowałem zapytania poniżej.

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; 

wierzę SQLSERVER równowartość Oracle SELECT VALUE1 FROM DUAL SELECT wartosc1 lub wybierz 'Value1'.

Więc spróbuj

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; 

Ponieważ nie jestem sqlserver osoba może być tak, że RichardTheKiwi wersja Oracle select from dual jest lepsza.

+0

Odpowiednio, to SQL Server 2008 R2. Powinienem był określić, że jesteśmy ograniczeni do T-SQL. Jestem dość ograniczony do wybierania, aktualizowania, wstawiania i usuwania, nie mam dostępu do procedur przechowywanych (chociaż znalazłem sposoby obejścia tego), nie mogę tworzyć widoków ani tabel. –

2

Próbowałem coś podobnego:

najpierw utworzyć tabelę, która będzie zawierać wszystkie te wartości, które są potrzebne.

powiedzmy

create table table_values(values varchar2(30)); 

następnie spróbuj w klauzuli, jak poniżej:

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

ten powróci wartości potrzebne.

+0

W pierwszym poście wspomniał o żadnych stołach tmp! – elrado

1

W programie SQL Server 2008 można tworzyć tabele wyprowadzone, używając składni VALUES(...)(...)(...), np.

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

Uwagi:

  1. Każdy (...) po wartości to jednorzędowe, i można mieć wiele kolumn.
  2. Po wyprowadzonej tabeli jest aliasem podanym do tabeli i nazwami kolumn.
  3. LEFT JOIN przechowuje wartości z tabeli pochodzącej v nawet gdy rekord nie istnieje w tabela1
  4. Następnie możemy zachować tylko te rekordy, które nie mogą być dopasowane, tzn t1.column1 is null
  5. mam włączony pierwszą kolumnę w swoim wyborze do kolumny z v. kolumna2 została usunięta, ponieważ zawsze jest pusta