Несколько операторов INSERT INTO сбрасывают данные - PullRequest
0 голосов
/ 28 октября 2019

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

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

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

INSERT INTO portfolio (date, GOOG_adjusted_close) 
SELECT date, GOOG.close
FROM GOOG
ORDER BY date ASC;

INSERT INTO portfolio (date, CELG_adjusted_close) 
SELECT date, CELG.close
FROM CELG
ORDER BY date ASC;

INSERT INTO portfolio (date, NVDA_adjusted_close) 
SELECT date, NVDA.close
FROM NVDA
ORDER BY date ASC;

INSERT INTO portfolio (date, FB_adjusted_close) 
SELECT date, FB.close
FROM FB
ORDER BY date ASC;

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

INSERT INTO portfolio (date, GOOG_adjusted_close, CELG_adjusted_close, NVDA_adjusted_close, FB_adjusted_close) 
SELECT GOOG.date, GOOG.close, CELG.close, NVDA.close, FB.close
FROM GOOG, CELG, NVDA, FB
ORDER BY date ASC;

Я должен получить данные для цены закрытия каждой акции на данную дату (при условии, что данные существуютна эту дату. Однако работают только дата и цена закрытия из первого INSERT INTO, остальные отображаются как нулевые.

Текущий вывод

Примериз файлов CSV они загружаются в таблицу для соответствующей компании, а из этих таблиц - в таблицу портфолио.

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Возможно, немного другой подход, когда данные в портфеле определяются как первичный или уникальный ключ, а вставки имеют предложение о дублировании ключа (https://dev.mysql.com/doc/refman/8.0/en/insert-on-duplicate.html). Например,

drop table if exists goog,celg,portfolio;
create table portfolio(date date primary key,goog_adjusted_close int,CELG_adjusted_close int);
create table goog(date date ,close int);
create table celg(date date ,close int);
insert into goog values
('2010-01-01',1),('2010-02-01',2);
insert into celg values
('2010-01-01',1),('2010-02-01',2),('2010-03-01',3);

truncate table portfolio;
INSERT INTO portfolio (date, GOOG_adjusted_close) 
SELECT date, GOOG.close
FROM GOOG
on duplicate key update goog_adjusted_close = goog.close;

INSERT INTO portfolio (date, CELG_adjusted_close) 
SELECT date, CELG.close
FROM CELG
on duplicate key update celg_adjusted_close = celg.close;

select * from portfolio; 

+------------+---------------------+---------------------+
| date       | goog_adjusted_close | CELG_adjusted_close |
+------------+---------------------+---------------------+
| 2010-01-01 |                   1 |                   1 |
| 2010-02-01 |                   2 |                   2 |
| 2010-03-01 |                NULL |                   3 |
+------------+---------------------+---------------------+
3 rows in set (0.00 sec)

. Возможно, вывозможность отбросить заказ на вкладыши, поскольку он не используется.

0 голосов
/ 28 октября 2019

Я предполагаю, что это то, что вы хотите:

INSERT INTO portfolio (date, GOOG_adjusted_close, CELG_adjusted_close, NVDA_adjusted_close, FB_adjusted_close)     
    SELECT date,
           MAX(GOOG_adjusted_close),
           MAX(CELG_adjusted_close),
           MAX(NVDA_adjusted_close),
           MAX(FB_adjusted_close)
    FROM ((SELECT date, GOOG.close as GOOG_adjusted_close, NULL as CELG_adjusted_close, NULL as NVDA_adjusted_close, NULL as FB_adjusted_close
           FROM GOOG
           ) UNION ALL
           (SELECT date, NULL, CELG.close, NULL, NULL
            FROM CELG
           ) UNION ALL
           (SELECT date, NULL, NULL, NVDA.close, NULL
            FROM NVDA
           ) UNION ALL
           (SELECT date, NULL, NULL, NULL, FB.close
            FROM FB
           )
          ) d
    GROUP BY date;

Это объединяет все данные в одну строку. Ваша версия помещает все значения в столбец Google - что, вероятно, не то, что вы хотите.

Если вы используете JOIN, вам нужно быть осторожным, если даты не совпадают точно между разнымитаблицы.

...