SQL: добавить несколько столбцов из другого набора данных - PullRequest
0 голосов
/ 21 мая 2018

У меня есть набор данных train, который структурирован следующим образом:

+---+---+---+----------+----------+----------+                                  
|  a|  b|  c|aml_freq_a|aml_freq_b|aml_freq_c|
+---+---+---+----------+----------+----------+
|  v|  l|  l|        56|        42|        29|
|  u|  g|  l|        47|        46|        29|
|  s|  g|  l|        28|        46|        29|
|  v|  m|  l|        56|        33|        29|
|  h|  m|  l|        44|        33|        29|
+---+---+---+----------+----------+----------+

Столбцы aml_freq_a, aml_freq_b и aml_freq_c являются частотами соответствующих записей в a, b и * 1009.* столбец.Например, значение 56 в aml_freq_a - это, в основном, число / частота числа случаев, когда v произошло в столбце a.Аналогично для b и c.

У меня есть другой набор данных, называемый test, который содержит только столбцы a, b и c,

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  w|  j|  c|
|  a|  g|  w|
|  s|  d|  i|
|  g|  j|  r|
|  r|  b|  u|
+---+---+---+

Мне нужно добавить aml_freq_a, aml_freq_bи aml_freq_c столбцы к нему.Для этого я использовал подзапросы, которые соединяют test и train в столбце a, а затем выбирают столбец aml_freq_a.Я написал еще два подзапроса для b и c.Вот так выглядит мой запрос

SELECT test.*, 
       (SELECT aml_freq_a 
        FROM   test 
               LEFT JOIN train 
                      ON test.a = train.a), 
       (SELECT aml_freq_b 
        FROM   test 
               LEFT JOIN train 
                      ON test.b = train.b), 
       (SELECT aml_freq_c 
        FROM   test 
               LEFT JOIN train 
                      ON test.c = train.c) 
FROM   test 

Но когда я его запускаю, я получаю следующую ошибку

more than one row returned by a subquery used as an expression

Я не понял эту ошибку.Так как я делаю left join с test слева, как может быть больше строк?

Любое направление было бы здорово.

PS: я читал другоесообщения о той же самой проблеме, но способ, которым они достигли этой ошибки, отличается от того, что я делаю, и решения там не очень помогли мне.

1 Ответ

0 голосов
/ 21 мая 2018

Я думаю, вам просто нужно три объединения, по одному для каждого столбца частоты в таблице train:

SELECT
    t.a,
    t.b,
    t.c,
    tr1.aml_freq_a,
    tr2.aml_freq_b,
    tr3.aml_freq_c
FROM test t
LEFT JOIN train tr1
    ON t.a = tr1.a
LEFT JOIN train tr2
    ON t.b = tr2.b
LEFT JOIN train tr3
    ON t.c = tr3.c

Редактировать:

Еслиесли вы хотите использовать свой текущий подход, тогда может сработать что-то вроде этого:

SELECT
    t.*, 
   (SELECT aml_freq_a FROM train tr WHERE t.a = tr.a) aml_freq_a,
   (SELECT aml_freq_b FROM train tr WHERE t.b = tr.b) aml_freq_b,
   (SELECT aml_freq_c FROM train tr WHERE t.c = tr.c) aml_freq_c
FROM test t;

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

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