Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Выборка


Автор: Artemon 28.5.2007, 09:54
Есть тадблица

ID  VAL(nvarchar)
____________
1    a
2    b
3    c


Как НЕ выбрать из таблицы все данные, только в том случае, если во всей таблице есть ID равный 3.

Автор: SergKO 28.5.2007, 10:15
Код

declare @t table (id int, val nvarchar(50));

    insert into @t
        select 1, 'a'
        union all
        select 2, 'b'
        union all
        select 3, 'c';
    
      -- Если в таблице нет ни одной записи с id = 3, то будут выбраны все записи.    
    if not exists(select * from @t where id = 3)
        select * from @t;



Автор: Artemon 28.5.2007, 10:42
У меня немного другая ситуация:

Код

SELECT FILE_NAME FROM FILES 
LEFT JOIN UNIQUE_KEYS ON FILES.ID_FILE = UNIQUE_KEYS.ID_FILE 
LEFT JOIN ALL_UNIQUE_KEYS ON ALL_UNIQUE_KEYS.ID_ALL_UNIQUE_KEY = UNIQUE_KEYS.ID_ALL_UNIQUE_KEY
WHERE  UNIQUE_KEYS.ID_FILE is NULL OR ALL_UNIQUE_KEYS.SERIAL <> '062D1DFB-B25D'


Получается что ALL_UNIQUE_KEYS.SERIAL содержит сисок значений, в котором присутствует '062D1DFB-B25D'.
Я хочу чтобы зпрос не возвращл записей, если есть значение '062D1DFB-B25D'.


Автор: SergKO 28.5.2007, 11:31
Можно

Код

if not exists(select * from ALL_UNIQUE_KEYS where SERIAL = '062D1DFB-B25D')
     SELECT FILE_NAME 
     FROM FILES 
          LEFT JOIN UNIQUE_KEYS ON FILES.ID_FILE = UNIQUE_KEYS.ID_FILE 
          LEFT JOIN ALL_UNIQUE_KEYS ON ALL_UNIQUE_KEYS.ID_ALL_UNIQUE_KEY = UNIQUE_KEYS.ID_ALL_UNIQUE_KEY
     WHERE  UNIQUE_KEYS.ID_FILE is NULL 


или

Код

     SELECT FILE_NAME 
     FROM FILES 
          LEFT JOIN UNIQUE_KEYS ON FILES.ID_FILE = UNIQUE_KEYS.ID_FILE 
          LEFT JOIN ALL_UNIQUE_KEYS ON ALL_UNIQUE_KEYS.ID_ALL_UNIQUE_KEY = UNIQUE_KEYS.ID_ALL_UNIQUE_KEY
     WHERE  UNIQUE_KEYS.ID_FILE is NULL and not exists(select * from ALL_UNIQUE_KEYS where SERIAL = '062D1DFB-B25D')


Первый вариант предпочтительнее.

В результате выбираются все записи из таблицы FILES, для которых отсутствуют записи в подчиненной таблице UNIQUE_KEYS. Если-же в таблице ALL_UNIQUE_KEYS есть хотя бы одна запись с SERIAL = '062D1DFB-B25D', то набор вернется пустой (для второго случая) или выборка не будет производиться (для первого случая).


Автор: Artemon 28.5.2007, 12:20
А если я хочу чтобы exists проверял набор, который возвращает последний LEFT JOIN?

Автор: SergKO 28.5.2007, 13:12
1. Для случая 
Цитата(SergKO @  28.5.2007,  11:31 Найти цитируемый пост)
В результате выбираются все записи из таблицы FILES, для которых отсутствуют записи в подчиненной таблице UNIQUE_KEYS. Если-же в таблице ALL_UNIQUE_KEYS есть хотя бы одна запись с SERIAL = '062D1DFB-B25D', то набор вернется пустой (для второго случая) или выборка не будет производиться (для первого случая).

LEFT JOIN ALL_UNIQUE_KEYS ON ALL_UNIQUE_KEYS.ID_ALL_UNIQUE_KEY = UNIQUE_KEYS.ID_ALL_UNIQUE_KEY уже лишний. Т.е. его не следует указывать.

А для
Цитата(Artemon)
 если я хочу чтобы exists проверял набор, который возвращает последний LEFT JOIN?).

попробуйте

Код

     SELECT FILE_NAME 
     FROM FILES 
          LEFT JOIN UNIQUE_KEYS ON FILES.ID_FILE = UNIQUE_KEYS.ID_FILE 
     WHERE  UNIQUE_KEYS.ID_FILE is NULL 
     and not exists(select * from ALL_UNIQUE_KEYS t1 where t1.ID_ALL_UNIQUE_KEY = UNIQUE_KEYS.ID_ALL_UNIQUE_KEY and SERIAL = '062D1DFB-B25D')

Я сам не могу проверить.
Если я не правильно Вас понял, то напишите более подробно, что требуется получить.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)