SQL 处理空值时的多个连接
SQL multiple joins while dealing with null values
我对 SQL 语法以及如何完成查询有疑问。
我使用两个查询和一些 PHP 解决了我的问题。
但是,让我介绍一下我的数据库和问题。
Table structure
使用打印的唯一 ID table 我希望能够得到:
- 印刷品中的 dex 编号
- 图像(URL)来自印刷品
- 来自稀有的稀有
- 当不为 null 时从类型 x3 键入,否则我仍然想执行
- 来自 pokemon x5 的名称不为 null 否则我仍然想执行
收集所有值的查询非常简单
SELECT pr.dex,
pr.image,
p.name,
r.rarity,
t.type,
t2.type,
t3.type,
p1.name,
p2.name,
p3.name,
p4.name
FROM prints pr
JOIN pokemons p ON p.dex=pr.dex
JOIN rarities r ON r.id=pr.rarity
JOIN types t ON t.id=p.type
JOIN types t2 ON t2.id=pr.weakness
JOIN types t3 ON t3.id=pr.resistance
JOIN pokemons p1 ON p1.dex=p.evolveto
JOIN pokemons p2 ON p2.dex=p.evolveto2
JOIN pokemons p3 ON p3.dex=p.evolveto3
JOIN pokemons p4 ON p4.dex=p.evolvefrom
WHERE pr.id=2;
但对于某些 pr.id(s)
,pr.weakness
、pr.resistance
、p.evolveto
、p.evolveto2
、p.evolveto3
或 [=18= 的值] 可以而且应该为空。
当其中任何一个为空时,查询返回为空。
所以基本上我想要的是排除空值。
我尝试用 COALESCE()
包裹一些选择并用 CASE
玩了一下但没有成功。如果不管 pr.id
有什么值,只用一个查询就可以完成,那就太棒了。
您的 INNER JOIN 具有 ON 子句,这些子句在可能为 NULL 的字段上进行等值连接。
然而你还是想重新吵架,
显示给定字段为空。
您正在寻找的工具是 LEFT OUTER JOIN,
这将完全做到这一点。
https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join
例如
SELECT cat.name, cat.price, inv.qty, inv.date
FROM catalog cat
LEFT OUTER JOIN inventory inv ON cat.id = inv.cat_id
将显示目录项,即使它们尚未清点。
像COALESCE(inv.qty, 0)
这样的表达
可以方便地抑制 NULL
如果需要,在结果行中。
我对 SQL 语法以及如何完成查询有疑问。
我使用两个查询和一些 PHP 解决了我的问题。 但是,让我介绍一下我的数据库和问题。
Table structure
使用打印的唯一 ID table 我希望能够得到:
- 印刷品中的 dex 编号
- 图像(URL)来自印刷品
- 来自稀有的稀有
- 当不为 null 时从类型 x3 键入,否则我仍然想执行
- 来自 pokemon x5 的名称不为 null 否则我仍然想执行
收集所有值的查询非常简单
SELECT pr.dex,
pr.image,
p.name,
r.rarity,
t.type,
t2.type,
t3.type,
p1.name,
p2.name,
p3.name,
p4.name
FROM prints pr
JOIN pokemons p ON p.dex=pr.dex
JOIN rarities r ON r.id=pr.rarity
JOIN types t ON t.id=p.type
JOIN types t2 ON t2.id=pr.weakness
JOIN types t3 ON t3.id=pr.resistance
JOIN pokemons p1 ON p1.dex=p.evolveto
JOIN pokemons p2 ON p2.dex=p.evolveto2
JOIN pokemons p3 ON p3.dex=p.evolveto3
JOIN pokemons p4 ON p4.dex=p.evolvefrom
WHERE pr.id=2;
但对于某些 pr.id(s)
,pr.weakness
、pr.resistance
、p.evolveto
、p.evolveto2
、p.evolveto3
或 [=18= 的值] 可以而且应该为空。
当其中任何一个为空时,查询返回为空。
所以基本上我想要的是排除空值。
我尝试用 COALESCE()
包裹一些选择并用 CASE
玩了一下但没有成功。如果不管 pr.id
有什么值,只用一个查询就可以完成,那就太棒了。
您的 INNER JOIN 具有 ON 子句,这些子句在可能为 NULL 的字段上进行等值连接。 然而你还是想重新吵架, 显示给定字段为空。
您正在寻找的工具是 LEFT OUTER JOIN, 这将完全做到这一点。 https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join
例如
SELECT cat.name, cat.price, inv.qty, inv.date
FROM catalog cat
LEFT OUTER JOIN inventory inv ON cat.id = inv.cat_id
将显示目录项,即使它们尚未清点。
像COALESCE(inv.qty, 0)
这样的表达
可以方便地抑制 NULL
如果需要,在结果行中。