如何解决将SQL查询转换为X ++查询
我想让雇员在职位层次结构中的特定经理下,并使用以下sql代码实现它。 Iam是X ++的新增功能,我想将以下SQL查询转换为X ++查询,但是我编写的代码未编译,并显示错误的连接错误消息, 请需要您的帮助。
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
没有字段列表,您无法从此联接类型中获取值。 - 您的版本中仍然有
=
个比较运算符,它们都必须是==
。 - 表
HcmPositionWorkerAssignment
和HcmEmployment
是“ 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 举报,一经查实,本站将立刻删除。