sql — Ошибка с LEFT JOIN после условия WHERE ILIKE
Вопрос задан
Изменён 1 месяц назад
Просмотрен 19 раз
Столкнулся с проблемой с условием WHERE ILIKE. Решил проверить SQL запрос с условиями, но встретил ошибку и не понимаю как её исправить. В общем имею это:
LEFT JOIN public."Post" AS "Post" ON "Contact"."PostId" = "Post"."PostId" WHERE "Post"."DisplayName" ILIKE 'оператор машины' LEFT JOIN public."ContactPhone" AS "ContactPhone" ON "Contact"."ContactId" = "ContactPhone"."ContactId"
Это только честь из всех JOINов, но ошибка заключается в этом:
ERROR syntax error at or near "LEFT"
И она возникает после условия WHERE ILIKE. Как можно обойти её?
- sql
- postgresql
- join
- pgadmin4
3
Сразу после JOIN
может идти условие только в виде ON
. А WHERE
должно быть в самом конце, после всех JOIN
, одно на весь SELECT
.
Т.е. скорее всего тут нужно просто написать через AND
в ON
условие, поскольку оно относится именно к присоединяемой таблице:
LEFT JOIN public."Post" AS "Post" ON "Contact"."PostId" = "Post"."PostId" AND "Post"."DisplayName" LIKE 'оператор машины' LEFT JOIN public."ContactPhone" AS "ContactPhone" ON "Contact"."ContactId" = "ContactPhone"."ContactId"
В общем случае можно писать и так, добавив нужные условия в самом конце через WHERE
:
LEFT JOIN public."Post" AS "Post" ON "Contact"."PostId" = "Post"."PostId" LEFT JOIN public."ContactPhone" AS "ContactPhone" ON "Contact"."ContactId" = "ContactPhone"."ContactId" WHERE "Post"."DisplayName" LIKE 'оператор машины'
2
Зарегистрируйтесь или войдите
Регистрация через Google
Регистрация через Facebook
Регистрация через почту
Отправить без регистрации
Почта
Необходима, но никому не показывается
Отправить без регистрации
Почта
Необходима, но никому не показывается
Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки
SQL ЛЕВОЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ | Другой пример SQL LEFT INNER JOIN
SQL LEFT INNER JOIN — это тип соединения, который можно использовать для извлечения всех записей левой таблицы, т. е. совпадающие записи левого и правого присоединяются к нему. Соединения используются в тех случаях, когда нам нужно узнать данные, объединив записи двух или более таблиц. Левое внутреннее соединение специально используется, когда есть условие, при котором, независимо от того, присутствует ли совпадающая запись в правой таблице или нет, всегда должны извлекаться все записи левой таблицы.
Левая таблица — это таблица, имя которой указано сразу после предложения from, а таблица, имя которой указано после ключевого слова соединения, считается нашей правой таблицей при применении любого объединения. Если в правой таблице есть совпадающая запись, то извлекается и ее содержимое, а если такие совпадающие записи не найдены, то для этих столбцов, извлеченных из правой таблицы, извлекается значение NULL.
Синтаксис SQL LEFT INNER JOIN
Ниже приведен синтаксис LEFT INNER JOIN:
SELECT имя таблицы1.имя столбца1,имя таблицы1.имя столбца2,имя таблицы2.имя столбца1,. ... ИЗ имя таблицы1 LEFT JOIN имя таблицы2 ON имя таблицы1.имя_совпадающего_столбца = имя таблицы2.имя_совпадающего_столбца;
Спецификация ключевого слова INNER в левом внутреннем соединении не является обязательной, так как по умолчанию левое соединение рассматривается как левое внутреннее соединение в SQL. Таким образом, имя таблицы1 — это имя нашей левой таблицы, а имя таблицы2 — это имя нашей правой таблицы левого внутреннего соединения. Поскольку нам нужно получить наборы результатов, объединяющие обе таблицы, имена столбцов обеих таблиц извлекаются, как показано в приведенном выше синтаксисе; записи столбцов извлекаются таким образом, что указывается имя таблицы, а затем имя столбца, значение которого должно быть извлечено, путем простого разделения их точкой.
Все извлекаемые значения столбца разделяются запятой. Кроме того, столбцы, на основе которых должны быть найдены совпадающие записи из обеих таблиц, упоминаются в предложении ON синтаксиса.
Пример SQL LEFT INNER JOIN
Давайте рассмотрим две существующие таблицы в моей базе данных educba с именем educba_experts, в которых хранятся записи обо всех экспертах и их данные. В другой таблице с именем educba_articles хранятся сведения о статьях, назначенных экспертам, и их статусе. Чтобы увидеть структуру и содержимое обеих таблиц, мы будем использовать следующие операторы запроса:
Код:
SELECT * FROM `educba_experts`;
Вывод:
Код:
SELECT * FROM `educba_articles`;
Вывод:
Теперь нам нужно извлечь все записи из таблицы экспертов, а затем получить количество статей, назначенных этим экспертам. Детали, относящиеся к экспертам, можно получить из таблицы educba_experts, а количество статей, если оно имеется для экспертов, можно получить, выполнив соединение с таблицей educba_articles. В этом случае, поскольку мы должны получить записи экспертов независимо от того, есть ли какие-либо статьи, назначенные ему / ей, мы должны использовать левое внутреннее соединение.
Код:
ВЫБЕРИТЕ a. expert_name AS "Имя эксперта", DATE(a.joining_date_time) AS "дата присоединения", a.rate AS "ставка эксперта", COUNT(b.id) AS "количество статей" ОТ `educba_experts` а LEFT JOIN `educba_articles` b ПО a.id = b.expert_id СГРУППИРОВАТЬ ПО a.id;
Вывод:
Как мы видим, из таблицы educba_articles извлекаются все данные экспертов, такие как имя эксперта, дата его/ее присоединения, рейтинг эксперта и общее количество статей. . Поскольку в таблице educba_articles не найдено ни одного extry для названных экспертов parineeta gujrati и Omprakash Lalwani, для них извлекается значение NULL, а количество NULL равно нулю, значение 0 извлекается для экспертов, для которых записи отсутствуют в таблице. educba_articles. Поскольку нам нужно сгруппировать количество статей на основе идентификатора эксперта, мы сгруппировали набор результатов в столбце идентификатора псевдонима «a», который является псевдонимом educba_experts.
Давайте разберемся с реализацией левого внутреннего соединения на еще одном примере, рассматривая две таблицы.
Код:
ВЫБЕРИТЕ * ИЗ статей;
Вывод:
Код:
SELECT * FROM UpdatedArticles;
Вывод:
Теперь нам нужно получить все записи обновленных статей таблицы, независимо от того, найдено ли совпадение в статьях таблицы.
Код:
ВЫБЕРИТЕ a.articleid, a.articletopic, b.articletopic, b.rate ОТ `Обновленные статьи` a LEFT JOIN `Статьи` b ON a.articleid = b.articleid ;
Выполнение приведенного выше оператора запроса дает выходные данные, показанные ниже, содержащие нулевые значения, для которых не найдена соответствующая запись в таблице статей.
Вывод:
Заключение
Мы можем использовать ЛЕВОЕ ВНУТРЕННЕЕ СОЕДИНЕНИЕ, просто указав левое соединение в синтаксисе. Это помогает в извлечении всех записей левой таблицы независимо от того, найдена ли соответствующая запись в правой таблице для нее. Значение NULL извлекается для значений столбца правой таблицы, если соответствующая запись не найдена.
Рекомендуемые статьи
Мы надеемся, что эта информация EDUCBA о «SQL LEFT INNER JOIN» была вам полезна. Вы можете просмотреть рекомендуемые статьи EDUCBA для получения дополнительной информации.
- SQL-ДЕКОД()
- Столбец в SQL
- Хранимая процедура в SQL
- SQL ВЫБЕРИТЕ ОТЛИЧНЫЙ
Сравнение левого соединения и правого соединения
Недавно я подготовил урок о различиях между операторами левого соединения и правого соединения. Внешние соединения — отличный способ сопоставления таблиц, позволяя при этом включать строки из одной таблицы, которые не обязательно соответствуют другой таблице.
Хорошая новость заключается в том, что когда дело доходит до правого внешнего соединения или его близнеца, левого внешнего соединения, нет большой разницы для изучения. Когда дело доходит до дебатов о правом и левом внешнем соединении, это больше касается точки зрения.
Содержание
- В чем разница между Right Outer Join и Left Outer Join Transcript
- Как работают левые соединения
- Как работают правые соединения
- Сравнение внешних соединений
- Сравнение правых соединений 1 6 Сравнение левых соединений
- 6 90
Вы можете узнать больше об этом в видео выше, расшифровка следует за
В чем разница между правым внешним соединением и левым внешним соединением Стенограмма
С возвращением. В этом уроке мы узнаем разницу между правым и левым соединением.
Разница между левым и правым внешними соединениями связана с позицией таблицы. Левый и правый относятся к тому, где находится таблица по отношению к предложению FROM. Левая таблица — это таблица, которая находится в предложении FROM или слева от условия соединения, здесь предложение соединения. А правая таблица находится справа от предложения соединения.
Когда мы говорим о левом внешнем соединении, мы имеем в виду взять все строки из левой таблицы и соединить их со строками из правой таблицы. И наоборот, когда мы начнем изучать правые внешние соединения, мы будем говорить о том, что нужно взять все строки из правой таблицы и сопоставить их там, где это возможно, со строками из левой таблицы.
ЕСЛИ вы хотите узнать о других типах соединений, вам стоит прочитать SQL Joins — The Ultimate Guide.
Как работает Left Joins
Давайте разберемся, как работают оба соединения. Начнем с левого соединения SQL. Здесь у нас есть продукт, продажи и результаты.
Это похоже на то, что было во введении. Я добавил Фреда Орра в качестве еще одного примера, чтобы помочь нам с нашими соединениями. И, как вы помните из нашего введения, у нас есть запрос для левого внешнего соединения, поэтому теперь мы извлекаем ProductName, Sales.CustomerName из продукта, выполняем левое внешнее соединение для продаж, используя идентификатор продукта в качестве нашего совпадения.
Мы собираемся ввести имя клиента, чтобы получить результаты.
В этом случае, когда идентификатор продукта совпадает, все очень просто. Он действует так же, как внутреннее соединение, и мы подбираем совпадения для Джона Смита.
В случае внешнего соединения, где блендер, идентификатор продукта = 2, не имеет соответствия в таблице продаж. Получаем blender, а потом NULL. Это восходит к случаю, когда в левом внешнем соединении мы видим соответствие всем продуктам слева и, где мы можем, вытягивать строки справа.
Ну вот тот случай, когда мы действительно не можем тянуть подряд справа. Мы вводим значение NULL.
Как работают правильные соединения
Теперь посмотрим на правое внешнее соединение. В правильном объединении SQL вы можете увидеть, что наш оператор немного изменился. На самом деле, все, что мы изменили, это формулировку, слева направо, прямо здесь, в заявлении.
Как это будет работать?
Что ж, в случае с микшером для Джона Смита все работает точно так же. Когда мы включим микшер для Джона Смита, он получит результаты для Джона Смита.
Тем не менее, вы заметите, что для блендера сейчас нет блендера номер два для продаж, не так ли? что мы делаем для результатов здесь? Вы заметите, что блендер даже не отображается в результатах.
Продажи теперь определяют, какие строки отображаются в нашей таблице результатов, а блендер даже не появляется.
Вы увидите, где у нас есть имя John Smith для миксера, потому что это совпало. Конечно, Мэри Хоу с вертолетом, третий ряд. И затем обратите внимание, что Фред Орр является клиентом.
Он покупатель, который никогда ничего не покупал. у нас есть клиент без продукта. И потом, конечно, есть этот продукт, у которого нет покупателя. Он не отображается, потому что в нашем случае это не входит в схему сопоставления всего, что связано с продажами, а затем попытки сопоставления продукта.
Правое внешнее соединение извлекает каждую строку из продаж, а затем пытается сопоставить что-то из продукта. вот почему результат показывает каждую строку из продаж, а затем есть пробел для Фреда Орра.
Сравнение внешних соединений
Вот сравнение того, о чем мы все говорили. Ознакомьтесь с таблицей продуктов, в ней есть миксер, блендер, измельчитель. Там есть заказчик. Обратите внимание на левый оператор внешнего соединения и правый оператор внешнего соединения; единственная разница в том, что левое внешнее соединение имеет левое, а правое внешнее соединение мы просто изменили слово на правое.
Ключ к результатам тонкий, но очень важный. Я хочу, чтобы вы поняли и изучили здесь, что все результаты левого внешнего соединения зависят от продукта, потому что мы сказали: «Просмотрите таблицу продуктов и, где возможно, сопоставьте что-нибудь из продаж». если вы пойдете вниз по таблице продуктов, вы найдете миксер, блендер, измельчитель и так далее. А тут у меня миксер, блендер, измельчитель и так далее. У меня есть три результата, и все, а на блендер ничего нет, потому что ничего не было в продажах.
Сравнение правого соединения
Когда я перехожу к правому внешнему соединению, обратите внимание, что результаты полностью определяются строками из таблицы продаж. вы увидите Джона Смита, Мэри Хоу, Фреда Орра, Джона Смита, Мэри Хоу, Фреда Орра.
Где возможно, я бы сопоставил товары, чтобы попытаться получить соответствующий продукт, который купил этот человек. Мы знаем, что Джон купил миксер, Мэри купила измельчитель, а Фред ничего не купил. Есть нулевое значение.
Давайте сделаем несколько примеров. Вот пример правильного внешнего соединения. В этом объединении я извлекаю информацию из таблицы поставщиков продуктов. И для наших целей мы собираемся ввести только идентификатор продукта и имя.
Так как это правильное внешнее соединение, мы должны увидеть список всех поставщиков, а затем, по возможности, продукты, которые они поставляют. Если нет продуктов, которые они поставляют, мы все равно будем видеть поставщика, и тогда идентификатор продукта будет нулевым.
Я просто добавлю здесь немного бликов, я добавлю еще один столбец, потому что это выглядит скучно. давайте сделаем PV, а затем добавим… Посмотрим, какое поле мы хотим добавить. Сделаем стандартную цену. это даст нам идентификатор продукта и стандартную цену для этого продукта.
Это даст нам имена всех поставщиков, а затем продукты, которые они поставляют. И вы можете обнаружить, что некоторые поставщики не поставляют товары. Я не уверен. Что я могу сделать, чтобы проверить, есть ли люди, которые не поставляют продукт, так это сделать, где PV.product ID равен нулю. И что это позволит мне сделать, так это окончательно проверить мои результаты, чтобы увидеть, есть ли в нашей системе какие-либо поставщики, которые в настоящее время не поставляют продукт.
Вот они. У меня здесь есть несколько поставщиков или продавцов, и нет ни одного продукта, для которого они в настоящее время указаны.
Это может быть действительно хорошим методом исследования ссылочной целостности. И у меня есть еще пара примеров далее в курсе, которые исследуют это.
Но это хороший способ использования внешних объединений, потому что он позволяет исследовать взаимосвязь между двумя таблицами, а затем увидеть, где совпадения, в некотором смысле, терпят неудачу. то, что мы делаем здесь, это то, что мы говорим: «Присоединился к поставщику продукта». И когда вы видите сбой, то есть когда идентификатор бизнес-объекта не совпадает, поэтому мы не находим нашего поставщика в списке поставщиков продуктов, это может быть в некотором смысле сбоем, тогда дайте нам увидеть это и показать список этих продавцов.
Вот список этих продавцов. это поставщики, у которых еще не было продукта в нашей системе. Это может быть как хорошо, так и плохо, в зависимости от того, как настроены ваши бизнес-процессы. Возможно, это просто новые вендоры и мы еще не настраивали их продукты.
Сравнение левого соединения
Хорошо, теперь давайте возьмем тот же запрос и покажем его как левое внешнее соединение. И снова все, что мне нужно сделать, это изменить формулировку слева направо. Однако я собираюсь создать новый запрос, просто чтобы сохранить его.
Итак, вот моя копия моего запроса. Теперь я собираюсь сделать это левым внешним соединением. Имейте в виду, что простое изменение слова справа налево придает запросу совершенно другое значение. теперь мы ищем всех поставщиков продуктов, которые есть в нашей системе, у которых может не быть перечисленных поставщиков.
Это может быть более серьезной проблемой. Потому что мы говорим, что у нас на самом деле есть продукт в нашей системе, и мы думаем, что у нас есть список поставщиков, но по какой-то причине идентификатор бизнес-объекта, который бы ссылался на этого поставщика, не существует, и это было бы ошибкой ссылочной целостности.
Мы полагаемся на тот факт, что поставщик продукта связан с поставщиком через идентификатор бизнес-объекта. И теперь, когда у нас есть идентификатор бизнес-объекта и поставщик продукта, но в поставщике мы нарушили эту связь.
давайте запустим этот запрос и посмотрим, как он выглядит. Я получаю строки обратно. Опять же, я получаю довольно много строк. Я думаю, что самое быстрое, что здесь можно сделать, чтобы увидеть, может ли быть проблема со ссылками, — это добавить предложение where, как мы делали раньше. Это отличная техника для проверки ваших данных. давайте сделаем где V точка, а затем мы сделаем, чтобы идентификатор бизнес-объекта был нулевым, потому что, если бы мы посмотрели на …, я тоже поставлю это здесь, на всякий случай. Если он вернется, мы увидим его отображение.
Я не ожидаю никаких проблем. Я думаю, что наши данные в хорошем состоянии, но может возникнуть проблема. Без вопросов. Но опять же, это действительно хороший способ проверить вашу базу данных, чтобы убедиться, что все ваши отношения на месте.
Надеюсь, теперь вы хорошо понимаете разницу между левым и правым внешними соединениями. Помните, что левая таблица ссылается на таблицу в предложении FROM, а правая таблица — это таблица, которая находится после предложения соединения.