为什么子查询字段不过滤 tablix 而主查询字段过滤?

Why would a subquery field not filter tablix but main query field does?

我不太擅长 SQL 或 SSRS,所以请原谅任何不正确的术语。我在一家木材店工作,正在编辑一份零件报告,其中有一个现有查询 returns 分隔包含重复数据的字段。其中一个字段是来自某些连接的直接 select,另一个是别名的子查询。我想使用子查询字段只是为了保持一致。

我尝试将 tablix 过滤器设置为 [MAT_DESC] <>(留空),但 tablix 不过滤。 [MATNAME] <>(留空)有效。 not(isnothing([MAT_DESC])) = True 也有效。

WITH ORDERLIST AS (SELECT ... FROM ... WHERE...)
SELECT
IDBGPL.MATNAME, --THIS ONE WILL FILTER
(SELECT MAT.TEXT FROM MAT WHERE MAT.NAME=IDBGPL.MATID) AS MAT_DESC, --THIS ONE WON'T FILTER
(SELECT MAT.ORDERID FROM MAT WHERE MAT.NAME=IDBGPL.MATID) AS MAT_DESC2, --THIS ONE IS ALSO USED AND COMES FROM THE SAME TABLE
FROM ORDERLIST
INNER JOIN...
INNER JOIN...
INNER JOIN...

当我尝试使用子查询字段过滤 table 时,它不起作用。当我直接使用 selected 字段时,它确实如此。为什么SSRS对子查询字段的处理方式不同?

编辑:澄清一下。数据来自 CAD/CAM 程序。 IDBGPL table 包含系统中每个订单的每个部分。 MAT table 是描述每个 material 的程序部分。有一些 parent/child 部分父级没有 material。我想过滤掉那些父部分。

这可能 return NULL:

(SELECT MAT.TEXT FROM MAT WHERE MAT.NAME=IDBGPL.MATID) AS MAT_DESC

除了检查 NULL 值是否为 NULL 之外,您无法评估 NULL 值。

所以一个解决方案是永远不要让它为空:

ISNULL((SELECT MAT.TEXT FROM MAT WHERE MAT.NAME=IDBGPL.MATID),"") AS MAT_DESC

另一种解决方案是在外部(在 SSRS 中)检查它是否为 NULL,因此检查 NULL 或空白。您只需要了解它们不是相同的值即可。

您还应该考虑对 mat 执行 LEFT JOIN,而不是使用子查询。