我有一个表来计算单词出现次数WORD_COUNT(WORD, TOTAL)
,该表在另一个表的触发器中更新。这是在这样的分层查询中完成的:
创建单词和总数=1:
INSERT INTO WORD_COUNT(TOTAL, WORD)
SELECT 1, TRANSLATE(regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level),
'áéíóúÁÉÍÓÚ',
'aeiouAEIOU')
FROM DUAL
WHERE LENGTH(regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level)) >= 5
CONNECT BY regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level) IS NOT NULL;
这项工作非常完美,它将一个短语(推文)拆分为单词并将它们插入到 WORD_COUNT 中。
现在的问题是,当我想增加重复键的总数(WORD 是主键)时,我需要添加一个ON DUPLICATE KEY
似乎与子句不太吻合的CONNECT BY
子句。
此查询无法编译:
INSERT INTO WORD_COUNT(TOTAL, WORD)
SELECT 1, TRANSLATE(regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level),
'áéíóúÁÉÍÓÚ',
'aeiouAEIOU')
FROM DUAL
WHERE LENGTH(regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level)) >= 5
CONNECT BY regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level) IS NOT NULL
ON DUPLICATE KEY UPDATE TOTAL=TOTAL+1;
而这个也不是:
INSERT INTO WORD_COUNT(TOTAL, WORD)
WITH WORDS(WORD) AS
(SELECT DISTINCT 1,
TRANSLATE(regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level),
'áéíóúÁÉÍÓÚ',
'aeiouAEIOU')
FROM DUAL
WHERE LENGTH(regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level)) >= 5
CONNECT BY regexp_substr(:NEW.TWEET, '[^[:punct:]|[:space:]]+', 1, level) IS NOT NULL)
SELECT WORD FROM WORD_COUNT
ON DUPLICATE KEY UPDATE TOTAL = TOTAL + 1;
由于这发生在一个高流量表的触发器中,我想在一个查询中解决这个问题,但也许是时候考虑一个中间表了,是吗?
谢谢