【发布时间】:2016-11-02 20:09:34
【问题描述】:
我想在我需要每天运行的 SQL 连接语句中重用以前计算的结果集。例如,我有两个表:table_A 和 table_B,它们共享一个公共键,例如 ckey。我想在我的查询中使用 LEFT JOIN 来查找 table_A 中的数据记录,这些数据记录映射到基于 ckey 的 table_B 中的数据记录:
SELECT a*, b*
FROM table_A as A
LEFT JOIN table_B as B
ON A.ckey = B.ckey
然后我想将上述连接中不匹配的行存储在一个单独的表中,例如table_C,以便我可以定期查看它们并稍后更新 table_B 内容。对于table_A和table_B之间匹配的那些,我想将它们存储在一个新表中(我们称之为table_C)。为此,我希望使用 WITH 子句来临时存储结果集,如下所示:
CREATE TABLE IF NOT EXISTS table_C (ckey_to_review VARCHAR(10));
WITH left_join_result AS(
SELECT a*, b.ckey as b_ckey
FROM table_A as A
LEFT JOIN table_B as B
ON A.ckey = B.ckey),
non_matchable_data AS(
SELECT distinct ckey
FROM left_join_result AS C
WHERE b_ckey IS NULL),
matchable_data AS(
SELECT *
FROM left_join_result AS C
WHERE b_ckey IS NOT NULL)
/* use MERGE to upsert newly found unmatchable items */
MERGE INTO table_C AS t
USING non_matchable_data AS s
ON t.ckey_to_review = s.ckey
WHEN MATCHED THEN UPDATE SET ckey_to_review = s.ckey
WHEN NOT MATCHED THEN
INSERT (ckey_to_review)
VALUES (s.ckey)
/* then use data from 'matchable_data' above for something other procedures */
我后来才知道WITH clause are only allowed to be used with SELECT statement。为了提供更具体的上下文,我使用 Vertica 来执行此操作,以防有针对此问题的特定 Vertica 解决方案。我只拥有 SQL 的基本知识,所以我确信有某种设计模式可以指导我有效地做我想做的事情(也就是说,不需要我更多地调用 LEFT JOIN一次又一次地重复使用来自 LEFT JOIN 的结果集)。
【问题讨论】: