Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
Привет. Не могу найти решение, на, казалось бы, простой вопрос. Хочется упростить план следующего запроса. select id, Title from MyTable1 where id in ( select id EXCEPT SELECT id FROM Table2 ) [IMG]http://s020.radikal.ru/i709/1510/c1/486f9d11178dt.jpg[/IMG] Мне не нравится, что обращение к таблице Table1 происходит дважды (скриншоте отмечено цифрами 1 и 2), и, как видите - занимают по 47% времени выполнения всего запроса. Как быть ? |
21 окт 15, 16:00 [18308175] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
скриншот http://s020.radikal.ru/i709/1510/c1/486f9d11178d.png что то как то криво добавился. |
21 окт 15, 16:00 [18308183] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
|
||
21 окт 15, 16:03 [18308201] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
SELECT 42
|
||
21 окт 15, 16:03 [18308203] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
Извините. Запрос тоже криво вставил :)select id, Title from MyTable1 where id in ( select id from MyTable1 EXCEPT SELECT id FROM Table2 ) |
21 окт 15, 16:03 [18308208] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
|
||
21 окт 15, 16:04 [18308213] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
|
||||
21 окт 15, 16:04 [18308217] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
Суть в следующем. Есть таблица запросов (Table2). В ней хранится информация по поданным запросам для организаций (Table1). Нужно выяснить организации, для которых не было запроса (это делает Внутренний подзапрос). А затем взять информацию по этим организациям (их Title) |
21 окт 15, 16:06 [18308224] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
ну там рабочие таблицы. Я упростил запрос. Идея просто в том, что внутренний запрос берет данные из Таблицы1. Потом делает Except по таблице2. А затем вынужден снова обратится к Таблице1, чтобы выяснить Title... |
||
21 окт 15, 16:07 [18308235] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
NOT EXISTS что ли сделать ? |
||
21 окт 15, 16:07 [18308236] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
SELECT id,title FROM MyTable1 t1 LEFT JOIN MyTable2 t2 ON t1.id=t2.id WHERE t2.id IS NULL? |
||
21 окт 15, 16:08 [18308239] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
Уберите FROM из первого запроса EXCEPT. И не будет двух обращений, как я полагаю. Но не лучше ли WHERE NOT EXISTS(SELECT * FROM Table2 WHERE Table2.id=MyTable1.id)??? |
||
21 окт 15, 16:08 [18308240] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
|
||||
21 окт 15, 16:09 [18308251] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
Не понял фразы... |
||
21 окт 15, 16:11 [18308264] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
Помогло ! Спасибо. Вот я затупиил то... Спасибо ! |
||
21 окт 15, 16:13 [18308271] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
в Таблице2 может быть 1 или 0 записей для строки из Таблицы1. |
||
21 окт 15, 16:14 [18308280] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
А в исходном варианте такого произойти не может. Вы мне скажете, что имя id предполагает уникальность? Но нам не представили структуру, - следовательно, это лишь догадка. |
||||
21 окт 15, 16:16 [18308296] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47063 |
Начинать вопрос надо с предоставления скрипта таблиц. Тогда и недоразумений не будет. |
||||
21 окт 15, 16:18 [18308301] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
iap, ааа... просто мне из описания показалось, что ID - это уникальный идентифицирующий атрибут. |
21 окт 15, 16:20 [18308313] Ответить | Цитировать Сообщить модератору |
ProBiotek Member Откуда: Moscow Сообщений: 907 |
Akina, конечно. все верно. стандартный ID. Связка таблиц Таблица2 является просто вспомогательной-расширяющей для Таблицы1. Хранит даты запросов для организаций из Таблицы1. В Таблице2 может быть записей меньше чем в Таблица1 - если запросы были не для всех организаций еще; появилась новая организация между запросами |
21 окт 15, 16:25 [18308343] Ответить | Цитировать Сообщить модератору |
MasterZiv Member Откуда: Питер Сообщений: 34679 |
Вполне себе простой запрос. |
||
21 окт 15, 16:33 [18308384] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4813 |
Вы это хотели ? select id, Title from MyTable1 where id NOT in ( SELECT id FROM Table2 ) Что эквивалентно select t1.id, Title from MyTable1 T1 LEFT JOIN Table2 T2 ON t1.id = t2.id WHERE t2.id IS NULL |
||
21 окт 15, 17:20 [18308592] Ответить | Цитировать Сообщить модератору |
если бы не это
Guest |
|
||||||
21 окт 15, 17:29 [18308650] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9683 |
|
||
21 окт 15, 17:33 [18308678] Ответить | Цитировать Сообщить модератору |
Akina Member Откуда: Зеленоград, Москва, Россия Сообщений: 21042 |
То есть ты правда думаешь, что записи, у которых НЕТ СООТВЕТСТВИЯ, размножатся? |
||
21 окт 15, 17:38 [18308718] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |