微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将SQL查询转换为X ++查询

如何解决将SQL查询转换为X ++查询

我想让雇员在职位层次结构中的特定经理下,并使用以下sql代码实现它。 Iam是X ++的新增功能,我想将以下SQL查询转换为X ++查询,但是我编写的代码未编译,并显示错误的连接错误消息, 请需要您的帮助。

这是我想转换为x ++代码sql代码

select top 1 name from DIRPARTYTABLE
inner join HcmWorker ON HcmWorker.PERSON = DIRPARTYTABLE.RECID
AND HcmWorker.RECID = 
    (select top 1 worker from HCMPOSITIONWORKERASSIGNMENT  
    INNER JOIN HCMPOSITION ON HCMPOSITIONWORKERASSIGNMENT.POSITION =  HCMPOSITION.RECID
    AND HCMPOSITION.RECID = 
        (select TOP 1 ParentPosition from  hcmPositionHierarchy 
            INNER JOIN  hcmPositionHierarchyType on hcmPositionHierarchy.PositionHierarchyType = hcmPositionHierarchyType.RECID AND hcmPositionHierarchyType.HierarchyType = 0
            where hcmPositionHierarchy.Position = 
                (select top 1 POSITION from HCMPOSITIONWORKERASSIGNMENT  
                INNER JOIN HCMPOSITION ON HCMPOSITIONWORKERASSIGNMENT.POSITION =  HCMPOSITION.RECID
                where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM AND HCMPOSITIONWORKERASSIGNMENT.VALIDTO 
                AND HCMPOSITIONWORKERASSIGNMENT.WORKER = 
                    (select TOP 1 WORKER from hcmemployment where hcmemployment.RECID = 5637152077)))
    where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM AND HCMPOSITIONWORKERASSIGNMENT.VALIDTO);

以下是我编写的x ++代码

HcmPositionWorkerAssignment     HCMPOSITIONWORKERASSIGNMENT;
    DirPartyTable                   DIRPARTYTABLE;
    HcmPosition                     HCMPOSITION;
    HcmWorker                       HcmWorker;
    HcmPositionHierarchy            hcmPositionHierarchy;
    HcmPositionHierarchyType        hcmPositionHierarchyType;
    Hcmemployment                   hcmemployment;
    
  select firstonly name from DIRPARTYTABLE
join HcmWorker where HcmWorker.PERSON == DIRPARTYTABLE.RECID
&& HcmWorker.RECID == 
    (select firstOnly worker from HCMPOSITIONWORKERASSIGNMENT  
     JOIN HCMPOSITION where HCMPOSITIONWORKERASSIGNMENT.POSITION ==  HCMPOSITION.RECID
    && HCMPOSITION.RECID == 
        (select firstOnly ParentPosition from  hcmPositionHierarchy 
             JOIN  hcmPositionHierarchyType where hcmPositionHierarchy.PositionHierarchyType = hcmPositionHierarchyType.RECID && hcmPositionHierarchyType.HierarchyType == 0
            where hcmPositionHierarchy.Position == 
                (select firstOnly POSITION from HCMPOSITIONWORKERASSIGNMENT  
                JOIN HCMPOSITION where HCMPOSITIONWORKERASSIGNMENT.POSITION ==  HCMPOSITION.RECID
                where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM && HCMPOSITIONWORKERASSIGNMENT.VALIDTO 
                && HCMPOSITIONWORKERASSIGNMENT.WORKER == 
                    (select firstOnly WORKER from hcmemployment where hcmemployment.RECID == 12345678)))
    where GETDATE() between HCMPOSITIONWORKERASSIGNMENT.VALIDFROM && HCMPOSITIONWORKERASSIGNMENT.VALIDTO);

解决方法

X ++查询没有像SQL这样的圆括号之间的子查询的概念。您必须使用联接类型或有时拆分X ++查询才能获得相同的结果。可以在here中找到有关X ++查询语法的所有文档。

您的尝试的一般说明:

  • 请勿重用表变量。它们是单独的表缓冲区,而不仅仅是SQL中的表名(与SQL表别名相当)。
  • SQL构造.RecId = (select top 1 FieldName通常转换为X ++,就像... firstonly ... where exists ( ...
  • X ++中的
  • exist join没有字段列表,您无法从此联接类型中获取值。
  • 您的版本中仍然有=个比较运算符,它们都必须是==
  • HcmPositionWorkerAssignmentHcmEmployment是“ valid time state tables”。这些表在查询时需要特别注意。 SQL的between ValidFrom and ValidTo会自动应用在幕后(带注释的代码)。查询此范围的 outside 需要额外的关键字。 Examples可在文档中找到。

将所有这些应用于SQL查询将给出以下版本。它可以编译,但是可能需要进一步调整才能产生与SQL完全相同的结果。

HcmPositionWorkerAssignment     hcmPositionWorkerAssignment1,hcmPositionWorkerAssignment2;
DirPartyTable                   dirPartyTable;
HcmPosition                     hcmPosition1,hcmPosition2;
HcmWorker                       hcmWorker;
HcmPositionHierarchy            hcmPositionHierarchy;
HcmPositionHierarchyType        hcmPositionHierarchyType;
HcmEmployment                   hcmEmployment;

//utcdatetime refDateTime = DateTimeUtil::getSystemDateTime();

select firstOnly Name from dirPartyTable
    exists join hcmWorker
        where hcmWorker.Person == dirPartyTable.RecId
    exists join hcmPositionWorkerAssignment1
        where hcmPositionWorkerAssignment1.worker == hcmWorker.RecId
    exists join hcmPosition1
        where hcmPosition1.RecId == hcmPositionWorkerAssignment1.Position
    exists join hcmPositionHierarchy
        where hcmPositionHierarchy.ParentPosition == hcmPosition1.RecId
    exists join hcmPositionHierarchyType
        where hcmPositionHierarchyType.RecId == hcmPositionHierarchy.PositionHierarchyType
           && hcmPositionHierarchyType.HierarchyType == 0
    exists join hcmPositionWorkerAssignment2
        where hcmPositionWorkerAssignment2.Position == hcmPositionHierarchy.Position
         //&& hcmPositionWorkerAssignment2.ValidFrom <= refDateTime
         //&& hcmPositionWorkerAssignment2.ValidTo > refDateTime
    exists join hcmPosition2
        where hcmPosition2.RecId == hcmPositionWorkerAssignment2.Position
    exists join hcmEmployment
        where hcmEmployment.Worker == hcmPositionWorkerAssignment2.Worker
           && hcmEmployment.RecId == 12345678;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。