如何使用新的主键扩展 SQL table 以及为现有键添加值?
How can I extend an SQL table with new primary keys as well as add up values for exisiting keys?
我想加入或更新以下两个 table 并为现有单词添加 df
。因此,如果单词 endeavor
在第一个 table 中不存在,则应添加它的 df
值,或者如果单词 hello
在两个 table 中都存在s df
应该总结一下。
仅供参考,我正在使用 MariaDB 和 PySpark 对文档进行字数统计并计算 tf、df 和 tfidf 值。
Table 姓名:df
+--------+----+
| word| df|
+--------+----+
|vicinity| 5|
| hallo| 2|
| admire| 3|
| settled| 1|
+--------+----+
Table 姓名:word_list
| word| df|
+----------+---+
| hallo| 1|
| settled| 1|
| endeavor| 1|
+----------+---+
所以最后 updated/combined table 应该是这样的:
| word| df|
+----------+---+
| vicinity| 5|
| hallo| 3|
| admire| 3|
| settled| 2|
| endeavor| 1|
+----------+---+
到目前为止我尝试做的如下:
SELECT df.word, df.df + word_list.df FROM df FULL OUTER JOIN word_list ON df.word=word_list.word
SELECT df.word FROM df JOIN word_list ON df.word=word_list.word
SELECT df.word FROM df FULL OUTER JOIN word_list ON df.word=word_list.word
None 个有效,我要么得到一个 table,只有 null
个值,一些 null
个值,或者一些异常。我确定必须有一个简单的 SQL 语句来实现这一点,但我已经坚持了几个小时,也没有发现任何关于堆栈溢出的 relatable。
您只需要先将两个 table 进行 UNION,然后在单词上聚合。由于 table 的结构相同,因此非常容易。看看这个fiddle。由于您没有指定,我使用了 maria 10.3,但这些查询应该完全符合(几乎)任何 DBMS。
https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=c6d86af77f19fc1f337ad1140ef07cd2
select word, sum(df) as df
from (
select * from df
UNION ALL
select * from word_list
) z
group by word
order by sum(df) desc;
UNION 是 JOIN 的垂直表亲,即 UNION 垂直连接数据集或 row-wise,而 JOIN 水平添加它们,即通过向输出添加列。两个数据集都需要具有相同的列数才能使 UNION 起作用,并且您需要在此处使用 UNION ALL 以便联合 return 所有行,因为默认行为是 return 唯一行.在此数据集中,由于 settled 在两个 table 中的值为 1,如果您不使用 ALL 关键字,它在 UNION 中只有一个条目,因此当您对 df 的值求和时如您所料,将是 1 而不是 2。
如果您只是转移到新 table,则不需要 ORDER BY。我只是添加它以按照与您的示例输出相同的顺序获得我的结果。
如果这对你有用,请告诉我。
我想加入或更新以下两个 table 并为现有单词添加 df
。因此,如果单词 endeavor
在第一个 table 中不存在,则应添加它的 df
值,或者如果单词 hello
在两个 table 中都存在s df
应该总结一下。
仅供参考,我正在使用 MariaDB 和 PySpark 对文档进行字数统计并计算 tf、df 和 tfidf 值。
Table 姓名:df
+--------+----+
| word| df|
+--------+----+
|vicinity| 5|
| hallo| 2|
| admire| 3|
| settled| 1|
+--------+----+
Table 姓名:word_list
| word| df|
+----------+---+
| hallo| 1|
| settled| 1|
| endeavor| 1|
+----------+---+
所以最后 updated/combined table 应该是这样的:
| word| df|
+----------+---+
| vicinity| 5|
| hallo| 3|
| admire| 3|
| settled| 2|
| endeavor| 1|
+----------+---+
到目前为止我尝试做的如下:
SELECT df.word, df.df + word_list.df FROM df FULL OUTER JOIN word_list ON df.word=word_list.word
SELECT df.word FROM df JOIN word_list ON df.word=word_list.word
SELECT df.word FROM df FULL OUTER JOIN word_list ON df.word=word_list.word
None 个有效,我要么得到一个 table,只有 null
个值,一些 null
个值,或者一些异常。我确定必须有一个简单的 SQL 语句来实现这一点,但我已经坚持了几个小时,也没有发现任何关于堆栈溢出的 relatable。
您只需要先将两个 table 进行 UNION,然后在单词上聚合。由于 table 的结构相同,因此非常容易。看看这个fiddle。由于您没有指定,我使用了 maria 10.3,但这些查询应该完全符合(几乎)任何 DBMS。
https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=c6d86af77f19fc1f337ad1140ef07cd2
select word, sum(df) as df
from (
select * from df
UNION ALL
select * from word_list
) z
group by word
order by sum(df) desc;
UNION 是 JOIN 的垂直表亲,即 UNION 垂直连接数据集或 row-wise,而 JOIN 水平添加它们,即通过向输出添加列。两个数据集都需要具有相同的列数才能使 UNION 起作用,并且您需要在此处使用 UNION ALL 以便联合 return 所有行,因为默认行为是 return 唯一行.在此数据集中,由于 settled 在两个 table 中的值为 1,如果您不使用 ALL 关键字,它在 UNION 中只有一个条目,因此当您对 df 的值求和时如您所料,将是 1 而不是 2。
如果您只是转移到新 table,则不需要 ORDER BY。我只是添加它以按照与您的示例输出相同的顺序获得我的结果。
如果这对你有用,请告诉我。