使用通配符从不同的表中选择具有相同名称的列

时间:2012-04-24 15:10:36

标签: sql sql-server sql-server-2005

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

e.g。 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

等等

我可以选择表格名称&amp;列名来自:INFORMATION_SCHEMA.COLUMNS,如果这有帮助的话。我不维护这些表格。干杯!

1 个答案:

答案 0 :(得分:0)

好的,我想我明白你在做什么以及你为什么这样做。这不是一个好的情况,无论你做什么,表现都会很差,但由于你无法控制环境,我们必须弄清楚如何使用我们的工作。

我有一些改进建议。第一种是使用COALESCE语句。这将返回第一个非null值。你可以用以下代码替换你的case语句:

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

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

第二个选项是将此逻辑放入UDF。然后,您可以调用UDF以获取所需的值。这抽象出所有这些逻辑并使其更清洁。它本身的性能不会更高,但它会更整洁。

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