我不喜欢在两个地方定义相同的东西,如果我可以避免它。
我意识到下面的两个查询正在处理两个不同的表,但是这些表基本上保存了相同类型的数据(不同的谓词保证了两个查询),并且我认为下面的两个预测是“同样的事情在两个地方“。
当/如果我稍后修改这些查询,包括不同的列,我相信我总是希望投影保持相同。
考虑到这一点,并且没有使用动态SQL,并且在任何投影中都没有'*'(我的生产环境中不允许),我可以定义一次“列集”并在两个查询中使用它吗?
SELECT columnA
, columnB
, columnC
FROM Data
SELECT columnA
, columnB
, columnC
FROM DataArchive
答案 0 :(得分:1)
让您的基础是Data和DataArchive的联合并使用内联表值函数(SQL Server 2005及更高版本)吗?
CREATE FUNCTION UnifiedData (@LiveOnly bit, @ArchiveOnly bit)
RETURNS TABLE
AS
RETURN (
SELECT columnA
,columnB
,columnC
FROM (
SELECT 'Live' AS Src, *
FROM Data
WHERE @ArchiveOnly = 0
UNION ALL
SELECT 'Archive' AS Src, *
FROM DataArchive
WHERE @LiveOnly = 0
)
)
不是很好,但优化器应该很好地处理它,因为它是内联的。
答案 1 :(得分:0)
我想不出有效的方法。您当然可以使用两个表中的UNION ALL
创建一个视图,并添加一个将表名保存为字符串的列,然后执行SELECT columnA, columnB, columnC FROM view WHERE table = 'Data'
但这感觉就像是一个相当难看的黑客。< / p>
答案 2 :(得分:0)
是的,SQL这种方式很糟糕。没有全面的满意方式来做到这一点。以下是使用同义词的示例:
if object_id('DataSynonym') is not null drop synonym DataSynonym
create synonym DataSynonym for Data
select columnA, columnB, columnC from DataSynonym
if object_id('DataSynonym') is not null drop synonym DataSynonym
create synonym DataSynonym for DataArchive
select columnA, columnB, columnC from DataSynonym
以这种方式使用同义词的问题在于它们是全局的。如果您在一个连接中动态重新定义同义词,则会影响所有其他连接上的用户。
临时视图/函数或视图/函数变量可以解决问题。或者像SAS中可用的宏语言。
答案 3 :(得分:0)
在Data UNION ALL DataArchive上创建一个视图。如果您以后能够重构和组合2个表,这将对您现有的查询透明。