在Excel中使用复杂SQL命名列
时间:2020-03-06 14:19:40 来源:igfitidea点击:
我试图使用获取外部来运行此SQL。
它有效,但是当我尝试重命名子查询或者与此相关的任何内容时,它将其删除。
我尝试了as
,as
和在''
中的名称,as
然后在""
中的名称,
和空间一样。什么是正确的方法?
相关的SQL:
SELECT list_name, app_name, (SELECT fname + ' ' + lname FROM dbo.d_agent_define map WHERE map.agent_id = tac.agent_id) as agent_login, input, CONVERT(varchar,DATEADD(ss,TAC_BEG_tstamp,'01/01/1970')) FROM dbo.maps_report_list list JOIN dbo.report_tac_agent tac ON (tac.list_id = list.list_id) WHERE input = 'SYS_ERR' AND app_name = 'CHARLOTT' AND convert(VARCHAR,DATEADD(ss,day_tstamp,'01/01/1970'),101) = '09/10/2008' AND list_name LIKE 'NRBAD%' ORDER BY agent_login,CONVERT(VARCHAR,DATEADD(ss,TAC_BEG_tstamp,'01/01/1970'))
解决方案
我们可以摆脱dbo.d_agent_define子查询,而只需添加到代理定义表的联接中即可。
这段代码行得通吗?
select list_name, app_name, map.fname + ' ' + map.lname as agent_login, input, convert(varchar,dateadd(ss,TAC_BEG_tstamp,'01/01/1970')) as tac_seconds from dbo.maps_report_list list join dbo.report_tac_agent tac on (tac.list_id = list.list_id) join dbo.d_agent_define map on (map.agent_id = tac.agent_id) where input = 'SYS_ERR' and app_name = 'CHARLOTT' and convert(varchar,dateadd(ss,day_tstamp,'01/01/1970'),101) = '09/10/2008' and list_name LIKE 'NRBAD%' order by agent_login,convert(varchar,dateadd(ss,TAC_BEG_tstamp,'01/01/1970'))
请注意,我命名dateadd列是因为它没有名称。我还尝试使我们遵守如何加入的约定。为了使该查询更具可读性,我将在某些方面做一些不同的事情,但我只专注于摆脱子查询问题。
我没有这样做,但是我建议我们使用从中获取它们的表来限定所有列。
要删除SELECT语句中的子查询,我建议以下内容:
SELECT list_name, app_name, map.fname + ' ' + map.lname as agent_login, input, convert(varchar,dateadd(ss, TAC_BEG_tstamp, '01/01/1970)) FROM dbo.maps_report_list inner join (dbo.report_tac_agent as tac inner join dbo.d_agent_define as map ON (tac.agent_id=map.agent_id)) ON list.list_id = tac.list_id WHERE input = 'SYS_ERR' and app_name = 'CHARLOTT' and convert(varchar,dateadd(ss,day_tstamp,'01/01/1970'),101) = '09/10/2008' and list_name LIKE 'NRBAD%' order by agent_login,convert(varchar,dateadd(ss,TAC_BEG_tstamp,'01/01/1970'))
我首先使用括号创建了dbo.report_tac_agent和dbo.d_agent_define之间的内部联接。现在这是一组联接数据。
这些表的组合然后被连接到列表表,我假设这是这里的驱动表。如果我了解我们要对子选择做什么,这应该对我们有用。
正如其他张贴者所说的那样,我们应该在列上使用表名(例如map.fname),这只会使事情易于理解。我没有在我的示例中,因为我注意到100%确定哪些列与哪些表一起使用。请让我知道这是否对我们不利,并且返回的数据有误。这将使在需要时更容易解决。