我将日期表创建为日期作为表名的一部分。
恩。 data_02272015
,data_02282015
(名称格式为data_<mmddyyyy>
)。所有表都具有相同的模式。
现在,表格中有一个datetime
列TransactionDate
。我需要通过查询此列来获取所有记录。一个表存储相应日的24小时数据。因此,如果我使用日期2015-02-28 xx:xx:xx
查询,我只能查询表data_02282015
。但是,如果我想查询日期2015-02-27 xx:xx:xx
,我必须同时考虑表格data_02282015
和data_02272015
。
我可以像这样得到工会:
SELECT * FROM data_02272015
UNION
SELECT * FROM data_02282015;
但问题是我还需要检查表中是否存在任何一个表。因此,如果data_02282015
不存在,则查询失败。有没有一种方法,查询将从存在的表中返回记录。
所以, 如果两个表都存在,那么它将返回两个表的记录的并集。
如果任何一个表不存在,那么它将只返回现有表的记录。
如果两个表都不存在,则清空结果集。
我尝试过这样的事情:
SELECT IF( EXISTS(SELECT 1 FROM data_02282015), (SELECT * FROM data_02282015), 0)
...
但它没有奏效。
答案 0 :(得分:0)
试试这个脚本。作为一个完整的解决方案,您可以使用嵌入在存储过程中的以下内容,将id列替换为您需要的所有列。
-- temp table that will collect results
declare @tempResults table (id int)
-- Your min and max dates to iterate between
declare @dateParamStart datetime
set @dateParamStart = '2015-02-25'
declare @dateParamEnd datetime
set @dateParamEnd = '2015-02-28'
-- table name using different dates
declare @currTblName nchar(13)
while @dateParamStart < @dateParamEnd
begin
-- set table name with current date
SELECT @currTblName = 'data_' + REPLACE(CONVERT(VARCHAR(10), @dateParamStart, 101), '/', '')
SELECT @currTblName -- show current table
-- if table exists, make query to insert into temp table
if OBJECT_ID (@currTblName, N'U') IS NOT NULL
begin
print ('table ' + @currTblName + 'exists')
execute ('insert into @tempResults select id from ' + @currTblName)
end
-- set next date
set @dateParamStart = dateadd(day, 1, @dateParamStart)
end
-- get your results.
-- Use distinct to act as a union if rows can be the same between tables.
select distinct * from @tempResults
答案 1 :(得分:0)
如果我理解正确,您需要FULL JOIN
:
CREATE TABLE two
( val INTEGER NOT NULL PRIMARY KEY
, txt varchar
);
INSERT INTO two(val,txt) VALUES
(0,'zero'),(2,'two'),(4,'four'),(6,'six'),(8,'eight'),(10,'ten');
CREATE TABLE three
( val INTEGER NOT NULL PRIMARY KEY
, txt varchar
);
INSERT INTO three(val,txt) VALUES
(0,'zero'),(3,'three'),(6,'six'),(9,'nine');
SELECT *
FROM two t2
FULL JOIN three t3 ON t2.val = t3.val
ORDER BY COALESCE(t2.val , t3.val)
;
CREATE TABLE
INSERT 0 6
CREATE TABLE
INSERT 0 4
val | txt | val | txt
-----+-------+-----+-------
0 | zero | 0 | zero
2 | two | |
| | 3 | three
4 | four | |
6 | six | 6 | six
8 | eight | |
| | 9 | nine
10 | ten | |
(8 rows)