2013-12-09 3 views
1

Я использую SQL Server 2005, и у меня есть сценарий вроде этого:SQL фильтровать данные, если существует в другой таблице

select INV_Nr, INV_Date, INV_Customer 

    from INVOICE A, 
    left outer join CANCEL_INVOICE B on B.INV_Nr = A.INV_Nr 

Так как я могу добавить в «где» пункта/фильтр, который все INVOICE.INV_Nr, который существует в CANCEL_INVOICE.INV_Nr, не будет отображаться в результате запроса?

Спасибо,

ответ

3

Один из способов (probably the best) NOT EXISTS:

SELECT inv_nr, 
     inv_date, 
     inv_customer 
FROM invoice i 
WHERE NOT EXISTS(SELECT 1 
        FROM cancel_invoice c 
        WHERE c.inv_nr = i.inv_nr) 

LEFT OUTER JOIN подхода может работать, но является менее эффективным и не приводит к неверным (или, по крайней мере, неожиданным) результатам, так как нет способ различать строку, которая не существует, и строку, которая существует, но где этот столбец NULL.

+0

Спасибо !! Оно работает!!^_^.. – Captain16

0

Попробуйте это!

Это показывают все те счета A.INV_Nr, который не существует в таблице CANCEL_INVOICE

SELECT INV_Nr, INV_Date, INV_Customer 
    FROM INVOICE A, 
    LEFT OUTER JOIN CANCEL_INVOICE B ON A.INV_Nr=B.INV_Nr 
    WHERE B.INV_Nr IS NULL 
Смежные вопросы