1

我有两个 XML 文档 Students.xml 和 Admission.xml,我需要一个 xquery 来返回从入学日期起 30 天完成的学生的学生 ID 和学生姓名。我对如何加入他们以及使用条件提出困惑感到困惑,请帮助。

学生.xml

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<StudentDetails>
    <Student_ID>1</Student_ID>
    <Student_Name>Mark</Student_Name>
</StudentDetails>
<StudentDetails>
    <Student_ID>2</Student_ID>
    <Student_Name>Robin</Student_Name>
</StudentDetails>
<StudentDetails>
    <Student_ID>3</Student_ID>
    <Student_Name>Charlie</Student_Name>
</StudentDetails>
</root>

录取.xml

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<AdmissionDetails>
    <Admission_ID>1</Admission_ID>
    <Admission_Date>2017-10-06</Admission_Date>
    <Admission_Status>Admitted</Admission_Status>
    <Student_ID>3</Student_ID>
</AdmissionDetails>
<AdmissionDetails>
    <Admission_ID>2</Admission_ID>
    <Admission_Date>2017-04-14</Admission_Date>
    <Admission_Status>Admitted</Admission_Status>
    <Student_ID>2</Student_ID>
</AdmissionDetails>
<AdmissionDetails>
    <Admission_ID>3</Admission_ID>
    <Admission_Date>2017-08-16</Admission_Date>
    <Admission_Status>Admitted</Admission_Status>
    <Student_ID>1</Student_ID>
</AdmissionDetails>

到目前为止,我的代码是这样的,但它给了我一个重复值的结果,迫切需要帮助。

for $sid in doc("Student.xml")/root/StudentDetails/Student_ID
for $aid  in doc("Admission.xml")/root/AdmissionDetails/Student_ID
for $x in doc("Admission,xml")/root/AdmissionDetails/Admission_Date
where $sid = $aid and $x >current-date() + xs:dayTimeDuration("P30D")
return  $sid

这就是结果

<?xml version="1.0" encoding="UTF-8"?>
<Student_ID>1</Student_ID>
<Student_ID>1</Student_ID>
<Student_ID>10</Student_ID>
<Student_ID>10</Student_ID>
4

2 回答 2

1

我认为您陷入了认为每个查询都必须是 FLWOR 表达式的陷阱(这通常表明您编写 SQL 的时间过长)。

我会这样写:

    let $S30 := doc("Admission.xml")/*/Admission_Details
        [xs:date(Admission_Date) < current-date() + xs:dayTimeDuration("P30D")]
        /Admission_ID
    return doc("Student.xml")/*/StudentDetails[Student_ID = $S30]
于 2018-05-02T07:42:38.693 回答
0

您可以遍历StudentDetailsStudents.xml 文档中的每个文档,然后过滤 WHEREStudentDetails/Student_ID值等于 Admission.xmlAdmissionDetails元素的值Student_ID并且Admission_Date满足您的条件(您确定这是正确的日期过滤器吗?您的描述说完成Date 在 Admission 的 30 天内,但样本数据没有 Completion Date,只有 Admission Date ),然后返回满足 WHERE 子句条件的学生的Student_IDand 。Student_Name

for $student in doc("Student.xml")/root/StudentDetails
where doc("Admission.xml")/root/AdmissionDetails[
        Student_ID = $student/Student_ID and 
        xs:date(Admission_Date) < current-date() + xs:dayTimeDuration("P30D") 
      ]
return 
  ($student/Student_ID, $student/Student_Name)

XQuery 规范提供了“内部”和“外部”连接的示例,这些示例可能提供了丰富的信息。

于 2018-05-02T03:25:04.453 回答