📜  DocumentDB SQL-复合SQL查询

📅  最后修改于: 2020-11-28 13:40:37             🧑  作者: Mango


通过“复合查询”,您可以合并来自现有查询的数据,然后在显示报告结果(显示合并的数据集)之前应用过滤器,聚合等。复合查询检索有关现有查询的多个级别的相关信息,并将合并的数据显示为单个扁平化的查询结果。

使用Composite Query,您还可以选择-

  • 选择“ SQL修剪”选项以根据用户的属性选择删除不需要的表和字段。

  • 设置ORDER BY和GROUP BY子句。

  • 将WHERE子句设置为组合查询结果集的过滤器。

上面的运算符可以组成更强大的查询。由于DocumentDB支持嵌套的集合,因此可以将合成串联或嵌套。

让我们考虑此示例的以下文档。

AndersenFamily文件如下。

{ 
   "id": "AndersenFamily", 
   "lastName": "Andersen", 
    
   "parents": [ 
      { "firstName": "Thomas", "relationship":  "father" }, 
      { "firstName": "Mary Kay", "relationship":  "mother" } 
   ],
   
   "children": [ 
      { 
         "firstName": "Henriette Thaulow", 
         "gender": "female", 
         "grade": 5, 
         "pets": [ { "givenName": "Fluffy", "type":  "Rabbit" } ] 
      } 
   ],
   
   "location": { "state": "WA", "county": "King", "city": "Seattle" }, 
   "isRegistered": true 
}

SmithFamily文件如下。

{ 
   "id": "SmithFamily", 
    
   "parents": [ 
      { "familyName": "Smith", "givenName": "James" }, 
      { "familyName": "Curtis", "givenName": "Helen" } 
   ],
   
   "children": [ 
      { 
         "givenName": "Michelle", 
         "gender": "female", 
         "grade": 1 
      }, 
        
      { 
         "givenName": "John", 
         "gender": "male", 
         "grade": 7, 
            
         "pets": [ 
            { "givenName": "Tweetie", "type": "Bird" } 
         ] 
      } 
   ],
   
   "location": { 
      "state": "NY", 
      "county": "Queens", 
      "city": "Forest Hills" 
   },
   
   "isRegistered": true 
} 

WakefieldFamily文件如下。

{ 
   "id": "WakefieldFamily", 
    
   "parents": [ 
      { "familyName": "Wakefield", "givenName": "Robin" }, 
      { "familyName": "Miller", "givenName": "Ben" } 
   ],
   
   "children": [ 
      { 
         "familyName": "Merriam", 
         "givenName": "Jesse", 
         "gender": "female", 
         "grade": 6,
            
         "pets": [ 
            { "givenName": "Charlie Brown", "type": "Dog" }, 
            { "givenName": "Tiger", "type": "Cat" }, 
            { "givenName": "Princess", "type": "Cat" } 
         ] 
      },
        
      { 
         "familyName": "Miller", 
         "givenName": "Lisa", 
         "gender": "female", 
         "grade": 3,
            
         "pets": [ 
            { "givenName": "Jake", "type": "Snake" } 
         ] 
      } 
   ],
   
   "location": { "state": "NY", "county": "Manhattan", "city": "NY" }, 
   "isRegistered": false 
} 

让我们看一个级联查询的例子。

串联查询

以下是这将检索家庭中第一个孩子给定名称是米歇尔的ID和位置查询。

SELECT f.id,f.location 
FROM Families f 
WHERE f.children[0].givenName = "Michelle"

执行上述查询后,将产生以下输出。

[
   { 
      "id": "SmithFamily", 
      "location": { 
         "state": "NY", 
         "county": "Queens", 
         "city": "Forest Hills" 
      }
   }
]

让我们考虑级联查询的另一个示例。

串联查询

以下是查询,它将返回第一个子级大于3的所有文档。

SELECT * 
FROM Families f 
WHERE ({grade: f.children[0].grade}.grade > 3)

执行上述查询后,将产生以下输出。

[ 
   { 
      "id": "WakefieldFamily", 
      "parents": [ 
         { 
            "familyName": "Wakefield", 
            "givenName": "Robin" 
         },
        
         { 
            "familyName": "Miller", 
            "givenName": "Ben"
         } 
      ],
      
      "children": [ 
         { 
            "familyName": "Merriam", 
            "givenName": "Jesse", 
            "gender": "female", 
            "grade": 6,
                
            "pets": [ 
               { 
                  "givenName": "Charlie Brown", 
                  "type": "Dog" 
               },
                
               { 
                  "givenName": "Tiger", 
                  "type": "Cat" 
               },
                
               { 
                  "givenName": "Princess", 
                  "type": "Cat" 
               } 
            ] 
         }, 
            
         { 
            "familyName": "Miller", 
            "givenName": "Lisa", 
            "gender": "female", 
            "grade": 3,
                
            "pets": [ 
               { 
                  "givenName": "Jake", 
                  "type": "Snake" 
               } 
            ] 
         } 
      ],
      
      "location": { 
         "state": "NY", 
         "county": "Manhattan",
         "city": "NY" 
      },
      
      "isRegistered": false, 
      "_rid": "Ic8LAJFujgECAAAAAAAAAA==", 
      "_ts": 1450541623, 
      "_self": "dbs/Ic8LAA==/colls/Ic8LAJFujgE=/docs/Ic8LAJFujgECAAAAAAAAAA==/", 
      "_etag": "\"00000500-0000-0000-0000-567582370000\"", 
      "_attachments": "attachments/" 
   },
    
   { 
      "id": "AndersenFamily", 
      "lastName": "Andersen",
        
      "parents": [ 
         { 
            "firstName": "Thomas", 
            "relationship": "father" 
         },
            
         { 
            "firstName": "Mary Kay", 
            "relationship": "mother" 
         } 
      ],
      
      "children": [ 
         { 
            "firstName": "Henriette Thaulow", 
            "gender": "female", 
            "grade": 5,
                
            "pets": [ 
               { 
                  "givenName": "Fluffy", 
                  "type": "Rabbit" 
               } 
            ] 
         } 
      ],
      
      "location": { 
         "state": "WA", 
         "county": "King", 
         "city": "Seattle"
      },
   
      "isRegistered": true, 
      "_rid": "Ic8LAJFujgEEAAAAAAAAAA==", 
      "_ts": 1450541624, 
      "_self": "dbs/Ic8LAA==/colls/Ic8LAJFujgE=/docs/Ic8LAJFujgEEAAAAAAAAAA==/", 
      "_etag": "\"00000700-0000-0000-0000-567582380000\"", 
      "_attachments": "attachments/" 
   } 
]      

让我们看一个嵌套查询的例子

嵌套查询

以下是查询,它将迭代所有父母,然后返回familyName为Smith的文档。

SELECT * 
FROM p IN Families.parents 
WHERE p.familyName = "Smith"

执行上述查询后,将产生以下输出。

[ 
   { 
      "familyName": "Smith", 
      "givenName": "James" 
   } 
]

让我们考虑嵌套查询的另一个示例

嵌套查询

以下是查询,它将返回所有familyName

SELECT VALUE p.familyName
FROM Families f 
JOIN p IN f.parents

执行上述查询后,将产生以下输出。

[ 
   "Wakefield", 
   "Miller", 
   "Smith", 
   "Curtis" 
]