SQL 在 Where 子句中处理可为空的外键

标签 sql sql-server sql-server-2008-r2

假设我有一个名为 my_table 的表,其中包含 primary_key table_pk 和三个可空字段(外键),分别名为 X_fk、Y_fk 和 Z_fk,还有一个名为 data 的字段。表 X、Y 和 Z 都有一个主键字段和一个名称字段(例如 {X_pk, X_name}, {Y_pk, Y_name}, {Z_pk, Z_name})。

我想要一个查询,它在给定表 X、Y 和 Z 中的名称的情况下,从 my_table 中唯一地返回一行。

SELECT table_pk 
FROM my_table 
WHERE 
    X_fk = (SELECT X_pk FROM X WHERE X_name = ?) 
  AND 
    Y_fk = (SELECT Y_pk FROM Y WHERE Y_name = ?) 
  AND 
    Z_fk = (SELECT Z_pk FROM Z WHERE Z_name = ?)

虽然当我想查找行 (X_Name, Y_Name, Z_Name) = ('XXX', 'YYY', NULL) 时这不起作用,因为 Z_fk = NULL 永远不会导致 TRUE。我如何修改上述查询以从表中提取一个唯一条目来计算其中一些外键为 NULL 的唯一条目?

最佳答案

试试这个:

SELECT min(table_pk)
FROM my_table 
WHERE 
    ((X_fk = (SELECT X_pk FROM X WHERE X_name = ?)) OR (? IS NULL AND X_fk IS NULL))
AND 
    ((Y_fk = (SELECT Y_pk FROM Y WHERE Y_name = ?)) OR (? IS NULL AND Y_fk IS NULL)) 
AND 
    ((Z_fk = (SELECT Z_pk FROM Z WHERE Z_name = ?)) OR (? IS NULL AND Z_fk IS NULL))

关于SQL 在 Where 子句中处理可为空的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4998047/

相关文章:

sql-server - 将表表达式传递给表参数化函数

sql - 使用数组一次将3个表中的数据插入Postgresql数据库

sql - 旋转 1300 万条记录时,tempDB 在 SQL Server 中已满,旋转需要超过 28 小时

c# - 是否存在用于同步本地和远程 SQL Server 数据库的 .NET 技术?

sql - 具有某些条件的连续数

c# - 将 DBNull 传递给 SqlParameter 时出错

mysql - 如何在 MYSQL 中按列值分隔这些分组数据?

sql - 如何在 Sqlite 中使用时间序列,以及快速的时间范围查询?

sql - SQL Server 中具有多列的“In”子句

ssis - 从脚本任务执行 SSIS 包存储中的子包