У меня есть набор данных 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: Я читал другие сообщения об одной и той же проблеме, но способ, которым они достигли этой ошибки, отличается от того, что я делаю, и решения там не очень помогли мне.
Мне кажется, вам просто нужны три соединения, по одному для каждой из столбцов частоты в таблице 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;
Я могу сказать, потому что эти подзапросы должны всегда возвращать одно значение, чтобы избежать ошибки. И даже если это работает, метод соединения, который я дал, должен превзойти его.