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


Автор: Samotnik 13.1.2011, 20:10
привет.
помогите пожалуйста составить самый сложный запрос в мире.  smile 
Есть таблица 
Код

Message (
int id
char text
)

и таблица 
Код

Delivery (
int id
int id_message
boolean sent
)

Нужно составить запрос, который выберет все значения из таблицы message которые не попали в delivery + те, которые в delivery поле sent = false
 smile 

Автор: Zloxa 13.1.2011, 20:13
Код

select * from message m where not exist (select * from Delivery d wehre d.id_message=m.id and d.sent/*=true*/)

Автор: azesmcar 13.1.2011, 20:16
Код

select * from message as m left outer join delivery d on m.id = d.id_message
where
   d.sent is null or d.sent = false

кажется так, может нужно будет подправить немного.

Добавлено через 35 секунд
Zloxa

а аутержоином не лучше?

Автор: Zloxa 13.1.2011, 20:19
azesmcar, только при условии что id_message - ключ. Иначе еще distinct поверх.

Автор: azesmcar 13.1.2011, 20:21
Zloxa

А, ну по логике тут связь один к одному, должен быть ключ. smile 

Автор: Zloxa 13.1.2011, 20:21
Цитата(azesmcar @  13.1.2011,  20:16 Найти цитируемый пост)
а аутержоином не лучше? 

semijoin тоже не плох smile

Автор: azesmcar 13.1.2011, 20:22
Цитата(Zloxa @  13.1.2011,  20:21 Найти цитируемый пост)
semijoin тоже не плох 

Что это за зверь? Гугль выдает что-то про алгебру smile 

Автор: Zloxa 13.1.2011, 20:27
Цитата(azesmcar @  13.1.2011,  20:22 Найти цитируемый пост)
Гугль выдает

http://www.sql.ru/articles/mssql/2007/013001IntroductionToJoins.shtml#05

И таки я вляпался, тут семиантиджойн  smile 

Автор: azesmcar 13.1.2011, 20:30
Цитата(Zloxa @  13.1.2011,  20:27 Найти цитируемый пост)
>>>

ааа, ты про это smile 
не знал, что это так называется, спасибо за ликбез.

Автор: Zloxa 13.1.2011, 20:34
Цитата(azesmcar @  13.1.2011,  20:30 Найти цитируемый пост)
не знал, что это так называется

Не... это так не на зывается.. это так работает. smile
Цитата

В отличие от других операторов соединений,не существует явного синтаксиса для указания исполнения полусоединения, но SQL Server, в целом ряде случаев, использует в плане исполнения именно полусоединения.

 smile 

Автор: Samotnik 13.1.2011, 20:37
Zloxa, azesmcar, спасибо, круто. 
Я же говорил, что это самый сложный запрос в мире, даже обсуждение целое в теме получилось

Zloxa, подскажи пожалуйста, у меня уже есть запрос вот такой:
Код

select ms from Delivery dy inner join dy.message as ms where dy.deleted=:deleted and dy.sent=:sent and ms.category.id in (:ids)

и вот в него нужно вставить еще и твое условие, не поможешь объединить ? что-то у меня не получилось  smile

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