Один SQL-запрос, две записи?

Я пытаюсь получить данные из двух связанных таблиц с помощью внешнего ключа и сохранить данные в виде отдельных записей/объектов.

Лучшее решение, которое я нашел до сих пор, — это использование JOIN с префиксом столбца, чтобы различать две таблицы.

SELECT
  tableA.method AS tableA_method,
  tableB.primitiveType AS tableB_primitiveType
FROM tableB
JOIN tableA ON tableB.tableA_id = tableA.id
WHERE tableB.id = ?

Это работает, но означает, что я должен разделить данные после завершения запроса. Есть ли способ выполнить один запрос SQL, который возвращает отдельные записи для данных каждой таблицы?

Текущий результат: один объект/RowDataPacket со столбцами из обеих таблиц.

[ RowDataPacket { tableA_method: "some value", tableB_primitiveType: "some value }]

Желаемый результат: два объекта, по одному на каждую таблицу

[ RowDataPacket { method: "some value" }, RowDataPacket { primitiveType: "some value" }]

или

[ RowDataPacket { tableA: { method: "some value" }, tableB: { primitiveType: "some value }}]

Я изучил подзапросы, но они включают несколько запросов и могут быть не самым эффективным решением.

Не могли бы вы объяснить немного больше? Что вы имеете в виду под «хранить данные как отдельные записи/объекты»? Может быть, результат сейчас и результат, который вы хотите, также помогут

Silvan 28.07.2023 10:58

@Silvan: я внес уточнение в вопрос.

Candleout 28.07.2023 11:04

Насколько я знаю, один оператор SELECT может вернуть только один набор результатов. Однако хранимая процедура может возвращать несколько наборов результатов, так что вы можете изучить это.

Rob Eyre 28.07.2023 11:11

Пожалуйста, покажите как образцы данных, так и ожидаемый результат

Jonas Metzler 28.07.2023 11:25

@ДжонасМецлер. Я уточнил ожидаемый результат.

Candleout 28.07.2023 12:02
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
5
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

То, что вы хотите, имеет смысл только в том случае, если две таблицы имеют один и тот же столбец. Допустим, у tableA есть имя столбца и tableB. Теперь вы можете ПРИСОЕДИНИТЬСЯ к ним, но тогда вы получите 2 столбца. Если вы хотите «объединить» набор результатов, вы можете использовать UNION.

SELECT name FROM tableA
UNION
SELECT name FROM tableB

Один оператор SELECT не может возвращать разные наборы результатов из разных таблиц. Но зачем это делать? Вы можете просто запустить 2 разных SELECTS.

Спасибо @Сильван. Меня не интересует объединение данных из двух таблиц. Я просто хотел знать, можете ли вы получить два объекта (по одному для каждой таблицы) из одного запроса. Поскольку внешний ключ позволяет вам получить данные в одном объекте, размещение их в двух отдельных объектах казалось всего лишь небольшим шагом оттуда. Но я понял из вашего ответа, что это на самом деле невозможно.

Candleout 28.07.2023 11:41

Я не знаю, насколько вы опытны в SQL, потому что меня немного беспокоит использование слова объект в ваших текстах. SQL работает не с «объектами», а с таблицами. И в результате получается своего рода таблица. В таблице каждая строка должна иметь одинаковое количество столбцов.

Silvan 28.07.2023 11:46

У меня очень ограниченный опыт! Когда я говорю «объект», я имею в виду RowDataPacket в результате запроса. Это могло бы выглядеть так: [RowDataPacket { tableA_method: "некоторое значение", tableB_primitiveType: "некоторое значение}]. Я надеялся, что вы могли бы получить что-то вроде: значение" }] или это: [ RowDataPacket { tableA: { метод: "некоторое значение" }, tableB: { примитивный тип: "некоторое значение }}]

Candleout 28.07.2023 11:58

Да это невозможно. Вы должны запустить 2 разных запроса. Если вы хотите понять, почему попробуйте написать SQL внутри инструмента SQL, такого как DataSpell или какой-либо другой инструмент. Вы довольно быстро освоитесь!

Silvan 28.07.2023 12:01

Ладно, это то, что есть. Я надеюсь, что это так!

Candleout 28.07.2023 12:09

Вы можете настроить хранимую процедуру для выполнения двух запросов за один раз.

Настраивать:

DELIMITER // ;
CREATE PROCEDURE myProcedure (IN tableB_id INT)
       BEGIN

          SELECT tableA.*
          FROM tableA
          INNER JOIN tableB ON tableA.id = tableB.tableA_id
          WHERE tableB.id = tableB_id;

          SELECT tableB.*
          FROM tableB
          WHERE tableB.id = tableB_id;

       END//
DELIMITER ;

Затем, когда вы хотите вернуть два набора результатов одним вызовом, например, для идентификатора 123, вы можете использовать:

CALL myProcedure(123);

Спасибо @RobEyre! Это не совсем то, на что я рассчитывал, но все же попробую.

Candleout 28.07.2023 12:07

Другие вопросы по теме