如果存在任何一个表,则从多个表中获取记录的并集

时间:2015-02-28 12:18:13

标签: mysql sql

我将日期表创建为日期作为表名的一部分。 恩。 data_02272015data_02282015(名称格式为data_<mmddyyyy>)。所有表都具有相同的模式。

现在,表格中有一个datetimeTransactionDate。我需要通过查询此列来获取所有记录。一个表存储相应日的24小时数据。因此,如果我使用日期2015-02-28 xx:xx:xx查询,我只能查询表data_02282015。但是,如果我想查询日期2015-02-27 xx:xx:xx,我必须同时考虑表格data_02282015data_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)
...

但它没有奏效。

2 个答案:

答案 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)