首页 > 解决方案 > 如果使用 WHERE 子句不存在值,则创建表合并两个表设置默认值

问题描述

我想创建一个临时表,其中包含某些页面中某些单词的位置分数。

在 sqlite 我有 2 个表格、页面和单词位置:

pages
-------
|url|
|example.com|
|example2.com|
|example3.com|

和:

wordlocations
-------
|    url     |wordid|location|
|example.com |     1|       2|
|example.com |     1|      35|
|example.com2|     1|       0|
|example.com2|     1|      75|
|example.com3|     2|      75|

我想创建一个包含 url、最低位置分数的表,如果 word 不存在 => 将位置分数设置为 10000。所以在下面的示例中,当我想wordid = 1为它看起来像:

result
-------
|    url     |min(location)|
|example.com |            2|
|example2.com|            0|
|example3.com|       100000|

我试过了 CREATE TEMPORARY TABLE result AS SELECT url, IFNULL(MIN(location), 100000) FROM wordlocation WHERE wordid = 1 GROUP BY url;

但这忽略了 wordid 不存在的页面,即

result
-------
|    url     |min(location)|
|example.com |            2|
|example2.com|            0|

我将如何检索这样一个包含所有位置分数最低的页面的表,并且仍然保留不包含默认值的 wordids 的页面?

标签: sqlite

解决方案


检查UNION用于合并两种情况的此项:

CREATE TEMPORARY TABLE result AS  
    SELECT url, MIN(location) AS minlocation
    FROM wordlocations 
    WHERE wordid = 1
    GROUP BY url
    UNION
    SELECT url, 100000 AS minlocation
    FROM wordlocations 
    WHERE wordid <> 1
    GROUP BY url;

编辑,第二版:

CREATE TEMPORARY TABLE result AS  
    SELECT url, MIN(location) AS minlocation
    FROM wordlocations 
    WHERE wordid = 1
    GROUP BY url
    UNION
    SELECT url, 100000 AS minlocation
    FROM wordlocations 
    WHERE url NOT IN (SELECT DISTINCT url FROM wordlocations WHERE wordid = 1)
    GROUP BY url;

推荐阅读