0

我有两个表oldTablenewTable内容为:

oldTable

  key    value    volume
  ======================
  1      abc      10000
  2      def      5000

newTable

  key    value    volume
  ======================
  1      abc      2000
  2      def      3000
  3      xyz      7000

我想创建一个总结两个表中的volumes 的新表。即,新表应包含以下内容:

joined_table

  key    value    volume
  ======================
  1      abc      12000
  2      def      8000
  3      xyz      7000

我尝试了以下语句,但没有结果:

CREATE TABLE joined_table AS
SELECT key, value, volume
FROM (
    SELECT IF(oldTable.key != NULL, oldTable.key, newTable.key) AS key,
        IF(oldTable.value != NULL, oldTable.value, newTable.value) AS value,
        IF(oldTable.volume AND newTable.volume, oldTable.volume + newTable.volume,
    IF(oldTable.volume != NULL, oldTable.volume, newTable.volume)) AS volume
    FROM(
        SELECT oldTable.key, oldTable.value, oldTable.volume, newTable.key, newTable.value, newTable.volume
        FROM newTable FULL OUTER JOIN oldTable ON newTable.key = oldTable.key
    )alias
)anotherAlias;

但这给我一个错误的说法Query returned non-zero code: 10, cause: FAILED: Error in semantic analysis: Ambiguous column reference key

我尝试更改上述查询中的列名joined_table,但它给了我同样的错误。关于如何实现这一目标的任何帮助?

另外,有什么方法可以将结果覆盖到现有表中,oldTable而不是创建这个新表?

4

2 回答 2

0

好的。我设法使用以下方法完成了这项工作:

CREATE TABLE joined_table AS SELECT 
IF (newTable.key IS NULL, oldTable.key, newTable.key) as key, 
IF (newTable.value IS NULL, oldTable.value, newTable.value) as value, 
IF(newTable.volume IS NULL, oldTable.volume, 
   IF(oldTable.volume IS NULL, newTable.volume, oldTable.volume + newTable.volume)) as volume 
FROM newTable FULL OUTER JOIN oldTable ON newTable.key = oldTable.key;

我仍然必须弄清楚如何在不创建新表的情况下更新现有表。

更新

INSERT OVERWRITE TABLE oldTable SELECT... 对现有表进行更新。

于 2014-03-20T08:19:53.353 回答
0

您在查询中使用的词key是保留关键字。这可能是解析器抛出歧义错误的原因。您可以使用反引号来避免解析器将其读取为保留文字。

CREATE TABLE joined_table AS
SELECT `key`, value, volume
FROM (
SELECT IF(oldTable.`key` != NULL, oldTable.`key`, newTable.`key`) AS `key`,
    IF(oldTable.value != NULL, oldTable.value, newTable.value) AS value,
    IF(oldTable.volume AND newTable.volume, oldTable.volume + newTable.volume,
IF(oldTable.volume != NULL, oldTable.volume, newTable.volume)) AS volume
FROM(
    SELECT oldTable.`key`, oldTable.value, oldTable.volume, newTable.`key`, newTable.value, newTable,volume
    FROM newTable FULL OUTER JOIN oldTable ON newTable.`key` = oldTable.`key`;
)alias
)anotherAlias;
于 2014-03-20T07:41:24.260 回答