0

我有多个表(名称略有不同),列名相同,我加入了许多其他唯一表。然后我使用 Case 从这些表中选择数据以省略空值:

例如CASE WHEN x IS NULL THEN y ELSE x等等等等。

但是我担心我的查询速度很慢,因为我必须包含大量的案例功能。每次我们的表单发生变化时,都会生成该表单表的新副本,对于历史报告,我必须查询每个副本以将相关数据获取到每个“组”列的单个列中。我还有一个存储所有表的名称(和 ID)的表,并且想知道是否可以使用通配符来查询该表以自动查询所有历史表。由于所有列标题都相同,我希望使用如下子查询:

SELECT x, y, x FROM (
    SELECT form_name FROM table_of_table_names
        WHERE form_name LIKE '%mytypeofform%'

然后我可以正常加入这些数据,但显然上述方法不起作用。这也可以避免我在每次发生更改时都编辑我的查询。可能是我想要实现的并不比我的完整外部连接和多个案例函数快,但是每次我添加一个额外的案例函数时,报告的运行速度似乎要慢得多。我被告知我应该使用动态 SQL,但对此经验很少。谢谢!

附加信息:

SELECT DISTINCT 

FLODS_CASE_ENQUIRY_F00.CASE_ENQUIRY_ID AS 'Case ID', FLODS_CLASSIFICATION_D00.TYPE AS 'Type', 
CASE WHEN FLODS_101000385_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL THEN (CASE WHEN FLODS_101000386_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000488_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000489_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000508_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000509_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000511_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN (CASE WHEN FLODS_101000512_SPECIAL_UP_C00.PAYMENTSTATUS IS NULL 
                      THEN 'No Payment Status' ELSE FLODS_101000512_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000511_SPECIAL_UP_C00.PAYMENTSTATUS END) 
                      ELSE FLODS_101000509_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000508_SPECIAL_UP_C00.PAYMENTSTATUS END) 
                      ELSE FLODS_101000489_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000488_SPECIAL_UP_C00.PAYMENTSTATUS END) 
                      ELSE FLODS_101000386_SPECIAL_UP_C00.PAYMENTSTATUS END) ELSE FLODS_101000385_SPECIAL_UP_C00.PAYMENTSTATUS END AS 'Payment Status', 
<more columns inc. a couple more columns using similar case functions> 

FROM   FLODS_101000489_SPECIAL_UP_C00 FULL OUTER JOIN
                      FLODS_101000488_SPECIAL_UP_C00 FULL OUTER JOIN
                      FLODS_101000509_SPECIAL_UP_C00 FULL OUTER JOIN
                      FLODS_101000511_SPECIAL_UP_C00 full outer JOIN
                      FLODS_CASE_ENQUIRY_F00 ON FLODS_101000511_SPECIAL_UP_C00.CASE_ENQUIRY_ID = FLODS_CASE_ENQUIRY_F00.CASE_ENQUIRY_ID full outer JOIN
                      FLODS_101000512_SPECIAL_UP_C00 ON 
                      FLODS_CASE_ENQUIRY_F00.CASE_ENQUIRY_ID = FLODS_101000512_SPECIAL_UP_C00.CASE_ENQUIRY_ID FULL OUTER JOIN

等等等等

如果这有帮助,我可以从:INFORMATION_SCHEMA.COLUMNS 中选择表名和列名。我不维护这些表。干杯!

4

1 回答 1

0

好的,我想我了解您在做什么以及为什么要这样做。这不是一个好的情况,无论你做什么,性能都会很差,但是由于你无法控制环境,我们必须弄清楚如何使用我们拥有的东西。

我有一些改进建议。第一个是使用COALESCE语句。这将返回第一个非空值。您可以用以下内容替换您的案例陈述:

COALESCE(value1, value2, value3, 'no value')

这将返回第一个非空值。最后一个选项是作为最后手段返回的字符串。我相信您的字符串是“无付款状态”。

第二种选择是将此逻辑放入 UDF。然后,您可以调用 UDF 来获取您想要的值。这将所有这些逻辑抽象出来并使其更清晰。它本身不会更高效,但会更整洁。

第三个选项是创建某种临时表,您可以根据表中更改的数据对其进行更新。您可以将折叠的数据存储在一张大表中。我不确定这是否适合您,但它可能会通过执行一次而不是每次运行查询来提高性能。

于 2012-04-24T16:27:40.423 回答