Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Select * From ( Select * From MyTable) Where...  [new]
exw777
Member

Откуда:
Сообщений: 41
Можно ли привести в рабочий вид конструкцию
select * from
(select * from mybd.dbo.temp  
 except select * from mybd.dbo.main)
 where mybd.dbo.temp.id  = mybd.dbo.main.id 

Необходимо из результата selecta получившегося в скобках, выбрать те, в которых поле из таблицы temp не встречается в таблице main

Или без курсоров и прочего не обойтись?
3 апр 14, 16:42    [15828288]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
exw777
Member

Откуда:
Сообщений: 41
exw777
Можно ли привести в рабочий вид конструкцию
select * from
(select * from mybd.dbo.temp  
 except select * from mybd.dbo.main)
 where mybd.dbo.temp.id  = mybd.dbo.main.id 

Необходимо из результата selecta получившегося в скобках, выбрать те, в которых поле из таблицы temp не встречается в таблице main

Или без курсоров и прочего не обойтись?

точнее ВСТРЕЧАЕТСЯ, т.е. выводить те строки id`шки которых встречались в main`e
3 апр 14, 16:44    [15828302]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
Кавказ-сила
Member

Откуда: Москва
Сообщений: 261
https://www.sql.ru/forum/127456/rekomendacii-po-oformleniu-soobshheniy-v-forume
4. Сообщайте пожалуйста полную версию вашего MS SQL Server. Т.е. со всеми номерами сервисаков, патчей и фиксов. Лучше всего, если Вы приведете в своем сообщении результат запроса select @@version.

6. Если Ваш вопроc связан с созданием какого-то запроса, то предоставление Вами следующих материалов может существенно ускорить нахождение решения:
- скрипты создания таблиц;
- скрипты заполнения этих таблиц тестовыми данными;
- описание желаемого результата на примере тестовых данных.
3 апр 14, 16:45    [15828309]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
exw777, наверное, как то так:

select ex.* from
(select * from mybd.dbo.temp  
 except select * from mybd.dbo.main) as ex
join mybd.dbo.main as mn
 where ex.id  = mn.id
3 апр 14, 17:09    [15828484]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
То есть, конечно же
select ex.* from
(select * from mybd.dbo.temp  
 except select * from mybd.dbo.main) as ex
join mybd.dbo.main as mn
 [b]on[/b] ex.id  = mn.id
3 апр 14, 17:10    [15828494]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
EXISTS значительно эффективнее и нагляднее в данном случае
3 апр 14, 17:52    [15828798]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
iap
EXISTS значительно эффективнее и нагляднее в данном случае
Да, но для него надо перечислять все поля. Если таблицы небольшие, а колонок в них много, можно и так.
3 апр 14, 19:34    [15829438]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
exw777
Member

Откуда:
Сообщений: 41
Minamoto,
Ваш запрос почти всё правильно делает, только без distinct`a данные дублируются,
И еще интересно, таблица которая у вас названа ex.* она где-то хранится?
Т.е. на что-то нужно обращать внимание при задании её имени для избежания накладок?
http://a0.sderni.ru/d/701514/123.PNG.png
4 апр 14, 14:27    [15833176]     Ответить | Цитировать Сообщить модератору
 Re: Select * From ( Select * From MyTable) Where...  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
exw777, нигде не хранится, это подзапрос.

Данные не дублируются - ваш полученный результат - это по две строки с одинаковым m_id из таблицы keyboard.

т.е. подзапрос возвращает строку с m_id = 3 и строку с m_id = 4, при присоединении таблицы keyboard к каждой из них присоединяется по две строки, т.е. результат всего запроса - 4 строки.
Поскольку в select у вас выбираются только колонки из подзапроса, то, естественно, строки из подзапроса возвращаются по 2 раза.

Если не такая логика нужна, то можно на EXISTS переделать, как iap предложил

select ex.*
from (select * from mybd.dbo.temp
except
select * from mybd.dbo.main) as ex
where exists (select *
from mybd.dbo.main as mn
where ex.id = mn.id)
4 апр 14, 14:41    [15833283]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить