Я хотел бы выбрать несколько столбцов и создать представление в SQLite. Почему следующие фрагменты кода возвращают разные значения?
SELECT date, PCEDurableGoods FROM debtandsavings
left join (select date, FedRate FROM rates) using (date);
но это работает
SELECT * FROM debtandsavings
left join rates using (date);
Первый возвращает таблицу, указанную первой, без объединения, но позже возвращает полную таблицу, объединенную, как и ожидалось.
Ниже приведен пример данных
date PCEDurableGoods
2022-09-01 6.612628882215829
2022-08-01 6.581442803985115
2022-07-01 6.573571833810114
2022-06-01 6.573321162184561
2022-05-01 6.50050461361015
date FedRate
2022-09-01 2.56
2022-08-01 2.33
2022-07-01 1.68
2022-06-01 1.21
2022-05-01 0.77
результат из первого фрагмента кода (foobar)
date PCEDurableGoods
2022-09-01 6.612628882215829
2022-08-01 6.581442803985115
2022-07-01 6.573571833810114
2022-06-01 6.573321162184561
2022-05-01 6.50050461361015
результат второго кода (ожидаемый)
date PCEDurableGoods FedRate
2022-09-01 6.61262888221583 2.56
2022-08-01 6.58144280398512 2.33
2022-07-01 6.57357183381011 1.68
2022-06-01 6.57332116218456 1.21
2022-05-01 6.50050461361015 0.77
Эквивалент Python будет
out_df = pd.merge(df1[['date','PCEDurableGoods'],df2['date','FedRate'],on = 'date',how='left')
РЕДАКЦИИ: я обновил данные примера, так как люди были сбиты с толку датами.
Я отредактировал данные, чтобы сделать их воспроизводимыми. Ваш dbfiddle точно воспроизводит проблему
Что значит проблема? Запросы работают как положено: dbfiddle.uk/zcz67drB
Я немного новичок в sql, почему бы коду 1 не присоединиться?
С чего вы взяли, что он не присоединяется?
SELECT [список всех столбцов] FROM table1 LEFT JOIN (SELECT [список всех столбцов] FROM table2 USING (date); != SELECT * FROM table1 LEFT JOIN table2 USING (date); почему бы и нет?
В dbfiddle вы можете видеть, что код 1 не присоединяется?
Это запрос, который соединяется с помощью ЛЕВОГО соединения 1-й таблицы с запросом 2-й таблицы и возвращает только столбцы 1-й таблицы. Что ты ожидал? Найдите время, чтобы прочитать о LEFT соединениях: sqlitetutorial.net/sqlite-left-join
то, на что вы ссылались, и то, что вы сказали, говорят о двух разных вещах. В python левое соединение использует левые клавиши и находит совпадения в столбце соединения и добавляет выбранные столбцы. Точно во фрагменте кода 2
Вопрос в том, почему это не работает во фрагменте кода 1, а не работает во 2, где две вещи, которые он пытается соединить, идентичны dbfiddle.uk/e5NWr9I1
Ответ: в 1-м запросе вы выбираете только 2 столбца 1-й таблицы, но во 2-м запросе вы выбираете 2 столбца 1-й таблицы и 1 столбец 2-й таблицы (это результат *).
Кроме того, почему вы упомянули Python? Это SQL, где вы получаете то, что ВЫБИРАЕТЕ.


В первом примере выбираются date и PCEDurableGoods и возвращаются только эти два столбца в соответствии с запросом. Второй пример использует подстановочный знак и возвращает все столбцы из соединения, как и ожидалось.
С точки зрения фактического набора строк второй представленный вами вывод не соответствует вводу. 2022-05-01/2022-06-01 отсутствуют во второй таблице и должны возвращать NULL в FedRate. Это, скорее всего, означает, что вы не выполнили свои запросы к предоставленному вводу.
«В первом примере выбираются дата и PCEDurableGoods и возвращаются только эти два столбца в соответствии с вашим запросом». Да, я вижу это в выводе. Почему он не соединяется с частью 2 запроса. я добавил данные
Здесь выбраны только два столбца, но вы ожидаете три столбца.
SELECT date, PCEDurableGoods FROM debtandsavings
left join (select date, FedRate FROM rates) using (date);
Если вам нужен третий столбец, поместите его в список выбора
SELECT date, PCEDurableGoods, FedRate FROM debtandsavings
left join (select date, FedRate FROM rates) using (date);
Нет необходимости вручную отфильтровывать интересующие столбцы в подзапросе. Планировщики запросов SQL разрабатывают лучший и самый быстрый способ сделать это, и попытки дать ему подсказки, написав специальные запросы, могут в некоторых случаях просто запутать его. Просто используйте эту форму. SQL подскажет, где и в какое время собирать столбцы
SELECT date, PCEDurableGoods, FedRate
FROM debtandsavings
left join rates using (date);
Обновлено:
SQL является декларативным. Вы говорите ему, что хотите, и он точно определяет, что делать за кулисами. Используйте план запроса, чтобы увидеть, что он делает https://www.sqlite.org/eqp.html. Он будет фильтровать и присоединяться в любом порядке, который он считает самым быстрым. Нет необходимости явно уменьшать столбцы в подзапросах и т. д. Это сработает быстрее всего.
оооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооооо за за собой: выбрать столбцы из (таблица1 присоединиться к таблице2), В конце концов, это объединение 2 полных таблиц, а затем выбор столбцов из этого?
«Почему бы тебе не использовать вторую форму? Она проще». Я имею дело с экономическими данными о выпуске, так что поместите выпуск в таблицу, и 90% из них не имеют отношения к любому конкретному контексту.
добавление специального подвыбора с урезанными полями ничего не дает. Базы данных уже достаточно умны, чтобы захватывать только те поля, которые вам нужны.
Я не могу воспроизвести ваши результаты: dbfiddle.uk/dJRqAgUx