sql:从另一个数据集中添加多个列

i2loujxw  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(299)

我有一个数据集 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 jointest 在左边,怎么会有更多的行呢?
任何方向都行。
附言:我读了其他关于同一问题的帖子,但是他们得出这个错误的方式和我现在所做的不同,那里的解决方案对我帮助不大。

eh57zj3b

eh57zj3b1#

我想这里只需要三个连接,每个频率列对应一个 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;

我说可能,因为这些子查询必须始终返回单个值以避免错误。即使这样做有效,我给出的连接方法也应该比它更好。

相关问题