创建包含表名的虚拟列?

时间:2018-04-20 13:07:20

标签: sql sqlite

我有几年来的一系列DPISTAFF表(即DPISTAFF2010_2011)。它们每个包含近200,000条记录。我希望能够运行一个查询,从该表的每个表中返回一条记录,以便我可以比较多年的某些值。我使用UNION JOIN来执行此操作。

目前我有以下查询:

CREATE TEMP TABLE IF NOT EXISTS _Variables (Name TEXT PRIMARY KEY, Value TEXT);
INSERT OR REPLACE INTO _Variables VALUES ('VarFirstName', 'John');
INSERT OR REPLACE INTO _Variables VALUES ('VarLastName', 'Smith');

SELECT LastName,FirstName,BirthYear,(strftime('%Y', date('now')) - BirthYear) AS Age,LocalExp,TotalExp,TotSalary,TotFringe,WorkLocationName,SchoolName
FROM DPISTAFF2008_2009
WHERE DPISTAFF2008_2009.FirstName = (SELECT Value FROM _Variables WHERE Name = 'VarFirstName')
    AND DPISTAFF2008_2009.LastName = (SELECT Value FROM _Variables WHERE Name = 'VarLastName')
UNION ALL

SELECT LastName,FirstName,BirthYear,(strftime('%Y', date('now')) - BirthYear) AS Age,LocalExp,TotalExp,TotSalary,TotFringe,WorkLocationName,SchoolName
FROM DPISTAFF2009_2010
WHERE DPISTAFF2009_2010.FirstName = (SELECT Value FROM _Variables WHERE Name = 'VarFirstName')
    AND DPISTAFF2009_2010.LastName = (SELECT Value FROM _Variables WHERE Name = 'VarLastName')
UNION ALL

;DROP TABLE _Variables;

变量部分工作正常。如果我只运行一个没有第二个和UNION ALL的SELECT语句,那么查询成功返回1条记录,但目前我得到near ";": syntax error:我不知道我的语法错误是什么,但我认为这是正确的想法。

我的主要问题是区分返回的记录。我想要做的是生成一个用于查看的列,其中包含将从中返回记录的表的名称(至少数字,我只需要2010-2011,而不是DPISTAFF部分)。但我不想以任何方式修改表。我已经有一个名为Age的列,它是在不修改表的情况下动态生成的。是否有可能以类似的方式获取表的名称?

1 个答案:

答案 0 :(得分:2)

当您尝试运行完整查询时,您会收到语法错误,因为您的SELECT语句的格式如下:

select /* stuff */
union all
select /* more stuff */
union all;

您无法像此处一样以UNION结束查询; UNION运算符出现在两个您希望合并其结果集的查询之间。因此,如果您只有两个表可供选择,则只需要一个UNION ALL

select /* stuff */
union all
select /* more stuff */;

如果您有三个表,那么您需要两个UNION ALL s:

select /* stuff */
union all
select /* more stuff */
union all
select /* even more stuff */;

等等。至于将年份添加到结果集中,您可以将字符串文字放在SELECT列表中并为其指定别名。因此,具有两个人员表的整体查询可能如下所示:

create temp table if not exists _Variables (Name text primary key, Value text);
insert or replace into _Variables values
    ('VarFirstName', 'John'), 
    ('VarLastName', 'Smith');

select '2008-2009' as Year, T1.FirstName, T1.LastName /* more fields */ 
    from DPISTAFF2008_2009 T1
    where T1.FirstName = (select Value from _Variables where Name = 'VarFirstName' limit 1)
        and T1.LastName = (select Value from _Variables where Name = 'VarLastName' limit 1)
union all
select '2009-2010' as Year, T2.FirstName, T2.LastName /*more fields */ 
    from DPISTAFF2009_2010 T2
    where T2.FirstName = (select Value from _Variables where Name = 'VarFirstName' limit 1)
        and T2.LastName = (select Value from _Variables where Name = 'VarLastName' limit 1);

drop table _Variables;

输出:

sqlite> .read samplequery.sql
2008-2009|John|Smith
2009-2010|John|Smith