C# 仅获取已分配的最新部门的SQL语句
在我的数据库中,我有以下行和列: 我的问题是同一名员工有3个不同的部门,但他目前只活跃在1个部门。如何更改此SQL语句以仅包括他所处的最新部门,从分配开始和分配结束可以看出,该部门始于2018年,于2100年结束 质疑 错误消息: {执行SQL查询时出错:选择age1.*从KS_DRIFT.V_AGENT_ALLOCATION age1内部连接从KS_DRIFT.V_AGENT_ALLOCATION中选择maxDISTINCT AGENT_ID,其中LENGTHAGENT_INITIALS<5和'2018-08-15'在ALLOCATION_START和ALLOCATION_END之间,以及UPPERAGENT_INITIALS='JKKA'age2在age1上。AGENT_ID=age2。AGENT_ID按AGENT_I排序开头。} 也给了我一个内在的例外: {ORA-00904:\AGE2\.\AGENT\u ID \:ugyldig Identificator}C# 仅获取已分配的最新部门的SQL语句,c#,sql,database,oracle,visual-studio,C#,Sql,Database,Oracle,Visual Studio,在我的数据库中,我有以下行和列: 我的问题是同一名员工有3个不同的部门,但他目前只活跃在1个部门。如何更改此SQL语句以仅包括他所处的最新部门,从分配开始和分配结束可以看出,该部门始于2018年,于2100年结束 质疑 错误消息: {执行SQL查询时出错:选择age1.*从KS_DRIFT.V_AGENT_ALLOCATION age1内部连接从KS_DRIFT.V_AGENT_ALLOCATION中选择maxDISTINCT AGENT_ID,其中LENGTHAGENT_INITIALS
按最新开始日期降序订购,然后选择Top 1
string agentIdSubQuery = "AGENT_ID " +
"FROM " +
"KS_DRIFT.V_AGENT_ALLOCATION " +
"WHERE " +
"LENGTH(AGENT_INITIALS) < 5 " +
" AND ROWNUM = 1 " +
" ORDER BY ALLOCATION_START DESC";
编辑,将Top 1更改为Rownum=1,对于Oracle语法,按最新开始日期降序排序,然后选择Top 1
string agentIdSubQuery = "AGENT_ID " +
"FROM " +
"KS_DRIFT.V_AGENT_ALLOCATION " +
"WHERE " +
"LENGTH(AGENT_INITIALS) < 5 " +
" AND ROWNUM = 1 " +
" ORDER BY ALLOCATION_START DESC";
编辑,将Top 1更改为Rownum=1,对于Oracle语法如果要查找当前部门,应将分配日期与当前日期进行比较
您的查询已经有这个WHERE子句,因此对于提供的示例来说应该可以正常工作。但是,如果您希望使用ROWNUM特殊变量子句指定您只需要一行,则假定它是Oracle
SELECT DISTINCT AGENT_ID
FROM KS_DRIFT.V_AGENT_ALLOCATION
WHERE LENGTH(AGENT_INITIALS) < 5
AND ALLOCATION_START < CURRENT_DATE AND CURRENT_DATE < ALLOCATION_END
AND ROWNUM = 1
如果您正在寻找当前部门,则应将分配日期与当前日期进行比较
您的查询已经有这个WHERE子句,因此对于提供的示例来说应该可以正常工作。但是,如果您希望使用ROWNUM特殊变量子句指定您只需要一行,则假定它是Oracle
SELECT DISTINCT AGENT_ID
FROM KS_DRIFT.V_AGENT_ALLOCATION
WHERE LENGTH(AGENT_INITIALS) < 5
AND ALLOCATION_START < CURRENT_DATE AND CURRENT_DATE < ALLOCATION_END
AND ROWNUM = 1
表V_AGENT_ALLOCATION包含每个代理的各个部门以及代理在那里工作的日期。您需要代理的最后一个部门,这是通过Oracle的KEEP last获得的。但是,您的表中没有向我们提供太多信息。假设该部门由分配id引用:
表V_AGENT_ALLOCATION包含每个代理的各个部门以及代理在那里工作的日期。您需要代理的最后一个部门,这是通过Oracle的KEEP last获得的。但是,您的表中没有向我们提供太多信息。假设该部门由分配id引用:
错误消息显示最终生成的SQL: {执行SQL查询时出错:选择age1.*从KS_DRIFT.V_AGENT_ALLOCATION age1内部连接中,从KS_DRIFT.V_AGENT_ALLOCATION中选择maxDISTINCT AGENT_ID,其中LENGTHAGENT_INITIALS<5,分配开始和分配结束之间为'2018-08-15',在age1上为'JKKA'age2。AGENT_ID=age2。AGENT_ID按AGENT排序_缩写。} 如果将其格式化为可读,则会得到:
select age1.*
from ks_drift.v_agent_allocation age1
inner join
( select max(distinct agent_id
from ks_drift.v_agent_allocation
where length(agent_initials) < 5
and '2018-08-15' between allocation_start and allocation_end
and (upper(agent_initials) = 'JKKA') ) age2
on age1.agent_id = age2.agent_id
order by agent_initials
应该跳出两个语法问题:
maxdistinct代理id后缺少右括号。distinct也是冗余的
日期文字缺少日期关键字-它应该是日期“2018-08-15”或更好的绑定变量。
upperagent_initials='JKKA'周围的括号是多余的,但它们可能是由生成器逻辑产生的,并且最容易保留它们
不过,我不确定这与您的“最新分配的部门”要求有什么关系。一些不是屏幕截图的示例数据会有所帮助。您的错误消息显示最终生成的SQL: {执行SQL查询时出错:选择age1.*从KS_DRIFT.V_AGENT_ALLOCATION age1内部连接中,从KS_DRIFT.V_AGENT_ALLOCATION中选择maxDISTINCT AGENT_ID,其中LENGTHAGENT_INITIALS<5,分配开始和分配结束之间为'2018-08-15',在age1上为'JKKA'age2。AGENT_ID=age2。AGENT_ID按AGENT排序_缩写。} 如果将其格式化为可读,则会得到:
select age1.*
from ks_drift.v_agent_allocation age1
inner join
( select max(distinct agent_id
from ks_drift.v_agent_allocation
where length(agent_initials) < 5
and '2018-08-15' between allocation_start and allocation_end
and (upper(agent_initials) = 'JKKA') ) age2
on age1.agent_id = age2.agent_id
order by agent_initials
应该跳出两个语法问题:
maxdistinct代理id后缺少右括号。distinct也是冗余的
日期文字缺少日期关键字-它应该是日期“2018-08-15”或更好的绑定变量。
upperagent_initials='JKKA'周围的括号是多余的,但它们可能是由生成器逻辑产生的,并且最容易保留它们
不过,我不确定这与您的“最新分配的部门”要求有何关系。一些示例数据(不是屏幕截图)会有所帮助。还有其他方法吗?不知何故,这会使我的程序崩溃。可能还有另一种逻辑?选择TOP 1是MS SQL语法,而不是Oracle.rownum是在应用order by子句之前生成的,因此编辑后的版本不会出现问题也可以。William Robertson是对的。从Oracle 12c开始,我们可以使用FETCH第一行,在此之前我们使用窗口函数,在此之前我们在包含ORDER BY子句的子查询上使用ROWNUM,这违反了SQL st
顺便问一下,作为子查询结果,标准总是被认为是无序的。还有其他方法吗?不知怎的,这让我的程序崩溃了。可能是另一种逻辑?选择TOP 1是MS SQL语法,而不是Oracle.rownum是在应用order by子句之前生成的,因此编辑的版本也不会工作。William Robertson是对的。从Oracle 12c开始,我们可以使用FETCH FIRST ROW进行此操作,在此之前,我们使用了窗口函数,在此之前,我们在包含ORDER BY子句的子查询上使用了ROWNUM,这违反了SQL标准,因为子查询结果总是被认为是无序的。这在我使用Oracle数据库时不起作用。最初,你把你的问题贴在MySQL标签下。是的,我错了。您可以编辑它以与Oracle一起使用吗?据我所知,他们在甲骨文中使用了ROWNUM。刚刚编辑了答案。现在也是Oracle中的非法标识符。这不起作用,因为我使用的是Oracle数据库。最初,你在MySQL标签下发布了你的问题。是的,我错了。您可以编辑它以与Oracle一起使用吗?据我所知,他们在甲骨文中使用了ROWNUM。刚刚编辑了答案。NOW也是Oracle中的非法识别者。