Более чистый SQL-запрос - PullRequest
       4

Более чистый SQL-запрос

0 голосов
/ 04 декабря 2018

У меня есть 2 таблицы, которые объединяются с использованием внешнего ключа, например: столбец таблицы budget_items "id" и столбец таблицы транзакций "parent_id"

Каждая таблица имеет несколько похожих имен столбцов, например, имя и дата.Поэтому, когда я запрашиваю таблицу, я извлекаю данные следующим образом:

SELECT
                        budget_items.id AS BI_id,
                        budget_items.owner_id as BI_owner,
                        budget_items.name AS BI_name, 
                        budget_items.date AS BI_date,
                        budget_items.amount AS BI_amount,
                        budget_items.type AS BI_type,
                        transactions.id as TRANS_id, 
                        transactions.parent_id as TRANS_parent,
                        transactions.owner_id as TRANS_owner,
                        transactions.amount as TRANS_amount,
                        transactions.date as TRANS_date,
                        transactions.type as TRANS_type,
                        transactions.processed as TRANS_processed,
                        transactions.name AS TRANS_name 
                    FROM
                        myezbudget.budget_items budget_items,
                        myezbudget.transactions transactions
                    WHERE
                        budget_items.id = transactions.parent_id AND
                        budget_items.owner_id = ?`, [req.user.id]

Мой вопрос был бы, есть ли лучший способ сделать это с более кратким запросом?Я попытался с несколькими различными типами операторов соединения, но не смог вывести его так, как мне нравится.Я ни в коем случае не эксперт по SQL и буду признателен за любые предложения или рекомендации.

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Я бы:

  • Использовать современный синтаксис JOIN.
  • Использовать более короткие псевдонимы таблиц.

Запрос должен выглядеть следующим образом:

SELECT
    i.id AS BI_id,
    i.owner_id as BI_owner,
    i.name AS BI_name, 
    i.date AS BI_date,
    i.amount AS BI_amount,
    i.type AS BI_type,
    t.id as TRANS_id, 
    t.parent_id as TRANS_parent,
    t.owner_id as TRANS_owner,
    t.amount as TRANS_amount,
    t.date as TRANS_date,
    t.type as TRANS_type,
    t.processed as TRANS_processed,
    t.name AS TRANS_name 
FROM myezbudget.budget_items i
JOIN myezbudget.transactions t on i.id = t.parent_id 
WHERE i.owner_id = ?
0 голосов
/ 04 декабря 2018

Да, вы можете использовать внутреннее соединение вместо выбора двух таблиц в операторе FROM и связать их вместе в WHERE, выполнив это следующим образом:

SELECT
    budget_items.id AS BI_id,
    budget_items.owner_id as BI_owner,
    budget_items.name AS BI_name, 
    budget_items.date AS BI_date,
    budget_items.amount AS BI_amount,
    budget_items.type AS BI_type,
    transactions.id as TRANS_id, 
    transactions.parent_id as TRANS_parent,
    transactions.owner_id as TRANS_owner,
    transactions.amount as TRANS_amount,
    transactions.date as TRANS_date,
    transactions.type as TRANS_type,
    transactions.processed as TRANS_processed,
    transactions.name AS TRANS_name 
FROM
    myezbudget.budget_items budget_items,
INNER JOIN myezbudget.transactions AS transactions ON budget_items.id = transactions.parent_id
WHERE
    budget_items.owner_id = ?`, [req.user.id]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...