Search code examples
distinctsurrealdb

SurrealDB equivalent of SELECT DISTINCT


I have a table of courses that are RELATEd by requires_prerequisite to other courses. I am trying to get 2nd-level prerequisite dependencies for a course (courses that have courses as prerequisites which have this course as a prerequisite), and I have a query as follows:

SELECT id, <-requires_prerequisite<-course<-requires_prerequisite<-course AS indirect_postrequisites
FROM course WHERE id = course:APS105;

And that gives me this:

[
  {
    "time": "526.8µs",
    "status": "OK",
    "result": [
      {
        "id": "course:APS105",
        "indirect_postrequisites": [
          "course:ECE345",
          "course:ECE297",
          "course:ECE344",
          "course:ECE295",
          "course:ECE345",
          "course:ECE297",
          "course:ECE344",
          "course:ECE295"
        ]
      }
    ]
  }
]

However as you will notice, there are duplicate entries in here.¹ How do I filter out the duplicates? In standard SQL I would use

SELECT DISTINCT `in` FROM requires_prerequisite
WHERE `out` IN (SELECT `in` FROM requires_prerequisite WHERE `out`='APS105';

But if I try to use

SELECT DISTINCT id, <-requires_prerequisite<-course<-requires_prerequisite<-course AS indirect_postrequisites
FROM course WHERE id = course:APS105;

then I get

{
  "code": 400,
  "details": "Request problems detected",
  "description": "There is a problem with your request. Refer to the documentation for further information.",
  "information": "There was a problem with the database: Parse error on line 1 at character 0 when parsing 'SELECT DISTINCT id, <-requires_prerequisite<-course<-requires_prerequisite<-course AS indirect_postr'"
}

How can I filter out duplicate values?

¹ If you want to know why the duplicates appear, it's because

RELATE course:ECE297->requires_prerequisite->course:APS105;
RELATE course:ECE297->requires_prerequisite->course:ECE244;
RELATE course:ECE244->requires_prerequisite->course:APS105;

Solution

  • After scrounging the documentation, I found the array::distinct() function which did exactly what I wanted:

    SELECT id, array::distinct(<-requires_prerequisite<-course<-requires_prerequisite<-course) AS indirect_postrequisites FROM course WHERE id = course:APS105;
    
    [
      {
        "time": "537.8µs",
        "status": "OK",
        "result": [
          {
            "id": "course:APS105",
            "indirect_postrequisites": [
              "course:ECE345",
              "course:ECE297",
              "course:ECE344",
              "course:ECE295"
            ]
          }
        ]
      }
    ]