C# 仅获取已分配的最新部门的SQL语句

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

在我的数据库中,我有以下行和列:

我的问题是同一名员工有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}


按最新开始日期降序订购,然后选择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中的非法识别者。