SQL: добавить несколько столбцов из другого набора данных

0

У меня есть набор данных 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 и c. Например, значение 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 ответ

3
Лучший ответ

Мне кажется, вам просто нужны три соединения, по одному для каждой из столбцов частоты в таблице 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;

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

  • 0
    оно работает! Спасибо
  • 0
    Я могу звучать как идиот, но можете ли вы сказать мне, в чем разница между тем, что вы предоставили, и я написал. Это выглядит так же для меня (очевидно, это не так). Я также выбираю те же переменные, выполняя те же соединения. так почему у тебя работает?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню