sqlite - 如果使用 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 的页面?
解决方案
检查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;
推荐阅读
- android - 使用适配器时刷新android上的活动
- r - 使用 dbinom() 在问卷中以一定百分比出现答案的概率
- bootstrap-4 - MDbootstrap 指定 DataTable 搜索组件的呈现位置
- html - 在带索引的循环中选择单选按钮
- python - 'Sequential' 对象没有属性 'complie'
- regex - 在 Pyspark 中替换多个元素
- cordova - 标签不适用于科尔多瓦应用程序
- vba - VBA - 将列值转换为负值
- sql - 如何为 2 键主键创建标识列
- hybris - SAP HYBRIS - 将 backoffice-config.xml 拆分为多个 xml