
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
03.10.2015, 20:24:00
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
Здравствуйте. Есть две таблицы. Таблица 1: ID (цифра, первичный ключ), ... Таблица 2: ID (цифра, первичный ключ), iTableID (цифра, индекс, ключ из таблицы 1), iStatus (цифра статуса) Нужно сделать запрос к таблице 1 который вернёт все строки iID которых есть в колонке iTableID второй таблицы (хотя бы 1), при этом iStatus у второй таблицы должен быть равен 0. Мой вариант: SELECT * FROM Table1 WHERE (SELECT COUNT(*) FROM Table2 WHERE Table2.iTableID = Table1.iID AND Table2.iStatus = 0) > 0 Но этот код очень долго выполняется и сжирает очень много ресурсов (так как строк во второй таблице очень много). Пожалуйста, подскажите как его можно оптимизировать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 20:34:43
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
Вариант SELECT * FROM Table1 WHERE Table1.iID IN (SELECT Table2.iTableID FROM Table2 WHERE Table2.iStatus = 0) тоже не подходит, долго выполняется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 20:43:55
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 20:47:40
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
distinct не? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 20:58:43
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
pavlik201504, Код: sql 1. 2. а если в t2 комбинация {iTableID,iStatus} уникальная, то лучше так Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 21:00:02
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
и индекс на t2.iTableID непомешает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 21:43:26
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
Индекс есть, оба запроса выполняются слишком долго ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 22:46:31
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
distinct ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 22:53:41
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
вадяdistinct ??? Вот причём тут distinct ???! ТС, план показывай ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 23:02:15
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
exists,вадяdistinct ??? Вот причём тут distinct ???! Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 23:13:26
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
вадяexists,пропущено... Вот причём тут distinct ???! Вариант SELECT Table1.* FROM Table1 INNER JOIN Table2 ON Table2.iTableID = Table1.iID не подходит, так как возвращает слишком много одинаковых строк (ровно столько сколько записей в Table2 с ID из таблицы Table1). так тут автор условие пропустил просто WHERE Table2.iStatus = 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
03.10.2015, 23:17:13
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
pavlik201504Вариант SELECT * FROM Table1 WHERE Table1.iID IN (SELECT Table2.iTableID FROM Table2 WHERE Table2.iStatus = 0) тоже не подходит, долго выполняетсяПерепиши на WHERE EXISTS ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2015, 19:08:52
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
pavlik201504Здравствуйте. Есть две таблицы. Таблица 1: ID (цифра, первичный ключ), ... Таблица 2: ID (цифра, первичный ключ), iTableID (цифра, индекс, ключ из таблицы 1), iStatus (цифра статуса) Нужно сделать запрос к таблице 1 который вернёт все строки iID которых есть в колонке iTableID второй таблицы (хотя бы 1), при этом iStatus у второй таблицы должен быть равен 0. Мой вариант: SELECT * FROM Table1 WHERE (SELECT COUNT(*) FROM Table2 WHERE Table2.iTableID = Table1.iID AND Table2.iStatus = 0) > 0 Но этот код очень долго выполняется и сжирает очень много ресурсов (так как строк во второй таблице очень много). Пожалуйста, подскажите как его можно оптимизировать? Вот самое простое и супербыстрое решение: Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2015, 19:13:18
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
Lumixpavlik201504Здравствуйте. Есть две таблицы. Таблица 1: ID (цифра, первичный ключ), ... Таблица 2: ID (цифра, первичный ключ), iTableID (цифра, индекс, ключ из таблицы 1), iStatus (цифра статуса) Нужно сделать запрос к таблице 1 который вернёт все строки iID которых есть в колонке iTableID второй таблицы (хотя бы 1), при этом iStatus у второй таблицы должен быть равен 0. Мой вариант: SELECT * FROM Table1 WHERE (SELECT COUNT(*) FROM Table2 WHERE Table2.iTableID = Table1.iID AND Table2.iStatus = 0) > 0 Но этот код очень долго выполняется и сжирает очень много ресурсов (так как строк во второй таблице очень много). Пожалуйста, подскажите как его можно оптимизировать? Вот самое простое и супербыстрое решение: Код: sql 1. 2. 3. 4. не по ТЗ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.10.2015, 23:06:36
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
Lumix, Супер! То что нужно! Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.10.2015, 00:06:58
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
pavlik201504Lumix, Супер! То что нужно! Спасибо!Забавно. Вариант Lumix-а не отличается варианта выше ( 18231602 ). Ну разве что тем, что проверка iStatus = 0 забыта (о чем выше тоже говорилось). Но это все равно не препятствует появлению одинаковых записей в результате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.10.2015, 07:09:05
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
miksoftpavlik201504Lumix, Супер! То что нужно! Спасибо!Забавно. Вариант Lumix-а не отличается варианта выше ( 18231602 ).Отличается и ещё как :) Последний вариант (на который ТС так проэрегировал) можно переписать ещё проще (ТС-у ж нужны данные только из Table1, верно?) Код: sql 1. LumixВот самое простое и супербыстрое решение: Код: sql 1. 2. 3. 4. Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ? Поинтересуйся, это интересно :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.10.2015, 07:17:22
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
exists,Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ? Поинтересуйся, это интересно :)А ты поинтересуйся, что происходит с OUTER JOIN-ом, если необязательную сторону (в данном случае поле из таблицы b) проверять на равенство с константой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.10.2015, 07:29:38
|
|||
|---|---|---|---|
|
|||
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
miksoftexists,Ты знаешь в чём отличие условий в OUTER JOIN-е и в WHERE ? Поинтересуйся, это интересно :)А ты поинтересуйся, что происходит с OUTER JOIN-ом, если необязательную сторону (в данном случае поле из таблицы b) проверять на равенство с константой.если в where - то он становится inner. Но тут НЕ where !! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.10.2015, 07:42:37
|
|||
|---|---|---|---|
Выборка только тех строк, которые содержатся хотя бы 1 раз в другой таблице |
|||
|
#18+
exists,если в where - то он становится inner. Но тут НЕ where !!Да, тут моя промашка. Я на автомате посчитал что куча условий - это WHERE. Тем не менее, исходный недостаток запроса "слишком много одинаковых строк" остается в силе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=47&tablet=1&tid=1832648]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
30ms |
get topic data: |
23ms |
get forum data: |
1ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 349ms |

| 0 / 0 |
