Присоединение SQLite с выбором не присоединяется, как ожидалось

Я хотел бы выбрать несколько столбцов и создать представление в 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

https://dbfiddle.uk/e5NWr9I1

Эквивалент Python будет

out_df = pd.merge(df1[['date','PCEDurableGoods'],df2['date','FedRate'],on = 'date',how='left')

РЕДАКЦИИ: я обновил данные примера, так как люди были сбиты с толку датами.

Я не могу воспроизвести ваши результаты: dbfiddle.uk/dJRqAgUx

forpas 24.11.2022 06:39

Я отредактировал данные, чтобы сделать их воспроизводимыми. Ваш dbfiddle точно воспроизводит проблему

tjaqu787 24.11.2022 15:13

Что значит проблема? Запросы работают как положено: dbfiddle.uk/zcz67drB

forpas 24.11.2022 16:55

Я немного новичок в sql, почему бы коду 1 не присоединиться?

tjaqu787 24.11.2022 17:06

С чего вы взяли, что он не присоединяется?

forpas 24.11.2022 17:07

SELECT [список всех столбцов] FROM table1 LEFT JOIN (SELECT [список всех столбцов] FROM table2 USING (date); != SELECT * FROM table1 LEFT JOIN table2 USING (date); почему бы и нет?

tjaqu787 24.11.2022 17:16

В dbfiddle вы можете видеть, что код 1 не присоединяется?

tjaqu787 24.11.2022 17:23

Это запрос, который соединяется с помощью ЛЕВОГО соединения 1-й таблицы с запросом 2-й таблицы и возвращает только столбцы 1-й таблицы. Что ты ожидал? Найдите время, чтобы прочитать о LEFT соединениях: sqlitetutorial.net/sqlite-left-join

forpas 24.11.2022 17:24

то, на что вы ссылались, и то, что вы сказали, говорят о двух разных вещах. В python левое соединение использует левые клавиши и находит совпадения в столбце соединения и добавляет выбранные столбцы. Точно во фрагменте кода 2

tjaqu787 24.11.2022 19:46

Вопрос в том, почему это не работает во фрагменте кода 1, а не работает во 2, где две вещи, которые он пытается соединить, идентичны dbfiddle.uk/e5NWr9I1

tjaqu787 24.11.2022 19:51

Ответ: в 1-м запросе вы выбираете только 2 столбца 1-й таблицы, но во 2-м запросе вы выбираете 2 столбца 1-й таблицы и 1 столбец 2-й таблицы (это результат *).

forpas 24.11.2022 19:56

Кроме того, почему вы упомянули Python? Это SQL, где вы получаете то, что ВЫБИРАЕТЕ.

forpas 24.11.2022 20:04
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
12
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

С точки зрения фактического набора строк второй представленный вами вывод не соответствует вводу. 2022-05-01/2022-06-01 отсутствуют во второй таблице и должны возвращать NULL в FedRate. Это, скорее всего, означает, что вы не выполнили свои запросы к предоставленному вводу.

«В первом примере выбираются дата и PCEDurableGoods и возвращаются только эти два столбца в соответствии с вашим запросом». Да, я вижу это в выводе. Почему он не соединяется с частью 2 запроса. я добавил данные

tjaqu787 24.11.2022 15:16
Ответ принят как подходящий

Здесь выбраны только два столбца, но вы ожидаете три столбца.

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 полных таблиц, а затем выбор столбцов из этого?

tjaqu787 11.12.2022 02:14

«Почему бы тебе не использовать вторую форму? Она проще». Я имею дело с экономическими данными о выпуске, так что поместите выпуск в таблицу, и 90% из них не имеют отношения к любому конкретному контексту.

tjaqu787 11.12.2022 02:21

добавление специального подвыбора с урезанными полями ничего не дает. Базы данных уже достаточно умны, чтобы захватывать только те поля, которые вам нужны.

Nick.McDermaid 11.12.2022 06:00

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