【发布时间】:2015-05-05 23:06:58
【问题描述】:
假设我有 10 个表 (Table1 - Table10) 和每个表中的 10 列(假设 Column1 - Column10) - 跨表的列名相同。我想在所有表中为该表中的至少一行找到not NULL 的所有列,并将它们插入到临时表中,例如@usedColumns,稍后将在存储过程中使用。
假设您在任何或所有这些表中都有数百万条记录,那么最快、最有效的方法是什么?当前实现使用UNPIVOT,但我正在尝试重新设计该存储过程,因为它的运行速度非常慢。或者UNPIVOT真的是最有效的方式吗?
我想的一种方法是只检查if exists,但不知道如何将其放入一个有效的循环中:
if exists (select top 1 1
from Table1
where Column1 is not null)
insert into @usedColumns ( table_name, column_name )
values ( 'Table1', 'Column1' );
if exists (select top 1 1
from Table1
where Column2 is not null)
insert into @usedColumns ( table_name, column_name )
values ( 'Table1', 'Column2' );
...
有问题的数据库是 SQL Server,但我猜该解决方案也适用于 MySQL 和其他数据库。
【问题讨论】:
-
我知道在 MySQL 中这样做的唯一方法是使用
INFORMATION_SCHEMA.COLUMNS和 PREPARE-ing 构造的查询。
标签: mysql sql-server stored-procedures