powered by simpleCommunicator - 2.0.37     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / конструкция WHERE IN с несколькими полями сравнения
11 сообщений из 11, страница 1 из 1
конструкция WHERE IN с несколькими полями сравнения
    #38935388
Генн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет заглянувшим!
Столкнулся со следующей ситуацией:
Выбираю данные из одной таблицы с условием что пара полей записи должна совпадать с подобной парой из другой таблицы.
И само собой это не моё изобретение, подсмотрел:
запрос.1
Код: sql
1.
2.
3.
4.
SELECT *
FROM tblsrc
WHERE (fldfrst, fldto) 
IN (SELECT fldfrst, fldto FROM tblptrn)


SQLite сообщает о синтаксической ошибке при обращении из PHP, при выполнении в Менеджере/администраторе.
А вот такая конструкция отрабатывает ожидаемо:
запрос.2
Код: sql
1.
2.
3.
4.
SELECT *
FROM tblsrc
WHERE fldfrst
IN (SELECT fldfrst FROM tblptrn)


Пробовал MySQL - выдает ожидаемый результат по обоим запросам без претензий.

Интересно ... это особенности реализации версий или действительно мой косяк ?

Предвосхищая указания по направлению поиска - да, в учебнике подобного не нашел, потому и спрашиваю.
Необходимое решение получено другим запросом, но мне кажется это более наглядным и писанины меньше.
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935436
Генн,

заменить [NOT] IN на [NOT] EXISTS
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935437
Генн,

а после - вспомнить, что [NOT] IN | [NOT] EXISTS подзапросы оптимизируются через [LEFT] JOIN и заюзать это тсамый джойн в своем запросе...
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935452
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГеннА вот такая конструкция отрабатывает ожидаемо:
запрос.2
Код: sql
1.
2.
3.
4.
SELECT *
FROM tblsrc
WHERE fldfrst
IN (SELECT fldfrst FROM tblptrn)


Если хочешь делать такой подзапрос по нескольким полям, то просто склей их:
Код: sql
1.
2.
WHERE fldfrst || fldto 
IN (SELECT fldfrst || fldto FROM tblptrn)


Но это очень не рекомендуется делать на больших таблицах.

ГеннПробовал MySQL - выдает ожидаемый результат по обоим запросам без претензий.Если в самосвал можно загрузить сорок тонн угля, это вовсе не означает что эти же сорок тонн угля можно загрузить в легковушку. Несмотря на то, что и самосвал и легковушка это автомобили.



Добрый Э - ЭхГенн,

заменить [NOT] IN на [NOT] EXISTSС чего-бы это вдруг? Смысл у этих условий разный.


Добрый Э - Эха после - вспомнить, что [NOT] IN | [NOT] EXISTS подзапросы оптимизируются через [LEFT] JOIN и заюзать это тсамый джойн в своем запросе... А это да. Простой join здесь будет намного более удобным и быстрым.
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935460
White OwlС чего-бы это вдруг? Смысл у этих условий разный.с того бы это двруг. если сам не можешь понять - спроси, знающие люди объяснят...
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935464
единственное, что EXISTS-подзапрос в этом случае нужно будет скоррелировать на основной запрос...
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935698
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl[/src]
Если хочешь делать такой подзапрос по нескольким полям, то просто склей их:
Код: sql
1.
2.
WHERE fldfrst || fldto 
IN (SELECT fldfrst || fldto FROM tblptrn)


Но это очень не рекомендуется делать на больших таблицах.
[/quot]

Так склеивать вообще никогда нельзя не только из-за того что отвалятся индексы.
нужен дополнительный "магический символ",который гарантированно отсутствует в исходных полях
fldfrst || '~' ||fldto
без этого костыля ты получишь ошибочную выборку в определенных комбинациях значений двух полей.
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935730
Генн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята !
Всем спасибо за отзывчивость.
Но если обратите внимание на последние пару строк.... то заметите упоминание авторНеобходимое решение получено другим запросом
Вы меня абсолютно убедили что такой способ через WHERE-IN не эффективен, к тому же все руководства упоминают что использование IN нежелательно. О его, IN, нехорошей производительности полно постов по форумам.
Про самосвал с легковухой - ваще ярко, спасибо White Owl .
Добрый Э - Эх , извинии, я так и не понял зачем ты упоминал [NOT] в своем посту Добрый Э - Эх[NOT] IN на [NOT] EXISTS...
К стати это было мотивом еще раз покопаться в учебнике, спасибо.

Интерес состоял в другом:

- такая конструкция не работает только в моей ситуации или она в принципе не должна работать в реализациях SQLite ?

!!!
P.S. модуль SQLite версии 2.8.17 дернут из какой то реализации Денвера вмесе с пыхом и всё это запущено под Nginx на локалке с ОСью виндАЗ-7 спецом для образовательных целей, вместо консоли юзаю SQLite-Administrator ( http://sqliteadmin.orbmu2k.de/)
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38935838
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Генн,

sqlite не умеет в in несколько полей
https://www.sqlite.org/lang_expr.html
читай с The IN and NOT IN operators
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38936018
Генн
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PPA , я смотрел оригинальную доку, но не силен в аглицком... потому и не понял, потому и полез спрашивать.
Вопрос закрыт.
Всем огромное спасибо за внимание !
...
Рейтинг: 0 / 0
конструкция WHERE IN с несколькими полями сравнения
    #38936288
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГеннИнтерес состоял в другом:

- такая конструкция не работает только в моей ситуации или она в принципе не должна работать в реализациях SQLite ?Вопрос поставлен не верно. Но попытаюсь ответить:
В настоящее время, такая конструкция не предусмотрена стандартом языка SQL.
Никто не запрещает создателям СУБД добавлять к стандартному языку все что они пожелают, когда они реализуют свою собственную СУБД.
Как результат, мы имеем кучу разных СУБД с разными возможностями и разными диалектами SQL. Все эти диалекты совпадают между собой в пределах стандарта языка, но различаются в дополнениях.
Хочешь быть экспертом в конкретной СУБД - зубри ее диалект. Хочешь быть экспертом в СУБД вообще - зубри стандарт и учись использовать диалекты когда это оправдано.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / конструкция WHERE IN с несколькими полями сравнения
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]