Arhn - архитектура программирования

INNER JOIN с условием для столбца - эффективный способ

У меня есть 2 таблицы:

Сервис_БД:

введите здесь описание изображения

ОБЪЕКТ:

введите здесь описание изображения

Теперь у меня есть требование удалить избыточные столбцы в таблице LOB, такие как industryId и т. д., и использовать таблицу Service_BD для извлечения больших объектов для IndustryId, а затем получить сведения о конкретном LOB с помощью таблицы LOB.

Я пытаюсь получить один SQL-запрос, используя Inner Joins, но результаты странные.

Когда я запускаю простой SQL-запрос, подобный этому:

SELECT industryId, LobId 
FROM Service_BD 
WHERE industryId = 'I01' 
GROUP BY lobId

В результате получается 9 рядов:

введите здесь описание изображения

Теперь я хотел бы присоединиться к остальным столбцам больших объектов (конечно, за исключением отброшенных), чтобы получить из них сведения о больших объектах. Поэтому я использую следующий запрос:

SELECT * 
FROM LOB 
INNER JOIN Service_BD ON Service_BD.lobId = LOB.lobId 
WHERE Service_BD.industryId = 'I01' 
GROUP BY Service_BD.lobID

введите здесь описание изображения

Я получаю желаемые результаты, но у меня есть сомнения, является ли это наиболее эффективным способом или нет. Я сомневаюсь, потому что таблицы Service_BD и LOB содержат огромное количество данных, но у меня есть ощущение, что если сначала выполнить GROUP BY Service_BD.lobID, это уменьшит временную сложность условия WHERE.

Просто хотел узнать, правильно ли это написать запрос или есть ли лучшие способы сделать то же самое.

21.12.2014

  • Ваш запрос правильный. Одна вещь, которую вы можете сделать, чтобы немного ускорить это, - это переместить условие WHERE в предложение JOIN, например INNER JOIN Service_DB ON ServiceDB.lobID = LOB.lobID AND Service_DB.IndustryId='I01'. Но это может зависеть от используемой вами СУБД, о которой я нигде не упоминал. 21.12.2014
  • Поскольку запрос содержит столбцы в предложении SELECT, которые не упомянуты в предложении GROUP BY, я предполагаю, что это MySQL - насколько мне известно, никакая другая СУБД не имеет этой странной функции. 21.12.2014
  • @FrankSchmitt: если lobID является первичным ключом (или уникальным ключом), это действительно действительный (стандартный) SQL и будет работать и на Postgres: stackoverflow.com/q/27561914/330315 21.12.2014
  • Да, это MySQL, а lobId — первичный ключ. 21.12.2014
  • @a_horse_with_no_name . . . lobID не является первичным ключом, так как имеет повторяющиеся значения. Хотя в целом ваша точка зрения принята. Это не только работает в Postgres, но в этом случае приемлемо по стандарту. 21.12.2014
  • @a_horse_with_no_name Спасибо за разъяснение 21.12.2014
  • @a_horse_with_no_name . . . Не буду педантичным, но второе изображение для LOB имеет lobid в качестве второго столбца, и этот столбец имеет дубликаты. Первое изображение для Service_BD имеет lobid в качестве последнего столбца, а также имеет дубликаты. Я признаю, что эти изображения трудно читать, но lobid не может быть первичным ключом ни в одной из таблиц. 22.12.2014

Ответы:


1

Вы не упомянули, какой механизм БД вы используете, поэтому я предполагаю, что вы используете MySQL. В большинстве случаев GROUP BY будет выполняется только для строк, удовлетворяющих условию WHERE. Таким образом, GROUP BY выполняется только для извлеченного результата как INNER JOIN, так и WHERE.

я не думаю

SELECT * 
FROM LOB INNER 
JOIN Service_BD ON Service_BD.lobId = LOB.lobId 
WHERE Service_BD.industryId = 'I01' 
GROUP BY Service_BD.lobID

повышает производительность вашего запроса, но, безусловно, исключает дублирование lobID из вашего результата. Кроме того, я не вижу другого лучшего способа устранения дубликатов, кроме введения предложения HAVING, но я не думаю, что это улучшит производительность вашего запроса.

21.12.2014
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..