我有一个数据库模式,其中我有三个表A,B和C,其中A的主键ID是B和C的外键。我给出了一个条件,在该条件下,我应该查询A的一列,给定列B和C的一些值。
总结一下
A has two fields id and name
B has two fields id and age
C has two fields id and gender
我正在尝试设计一个查询,它将执行以下操作
`select * from A
Left join B on B.id = A.id and b.age = $1
Left join C on C.id = A.id and c.gender = $2;`
这里$1和$2来自Rust中的外部程序,可以为null。问题是即使我向这些查询传递有效的输入,过滤结果也是不正确的。
有没有更简单的方法来执行这个查询,使得Join 1只在$1不为null时发生,Join 2只在$2不为null时发生。
`select * from A
Left join B on B.id = A.id and b.age = $1
Left join C on C.id = A.id and c.gender = $2;`
我尝试了上面的查询,但结果不是预期的。
1条答案
按热度按时间6jjcrrmo1#
通过“Join 1 only occurs when $1 is not null and Join 2 only occurs when $2 is not null”,我假设所需的行为是仅当相关参数非NULL时才按年龄或性别过滤结果。我从
LEFT JOIN
的使用中推断,并不是表A中的每一行都需要在表B或表C中有对应的行,因此,年龄或性别可能是未知的。结果应该只包括已知与提供的参数匹配的行,还是应该包括年龄或性别未知的行?下面将讨论这两种情况。以下查询返回已知与提供的参数匹配的所有行:
如果结果应该包括未知年龄或性别沿着已知匹配,则可以使用以下查询: