Azure CosmosDB 中的左连接 SQL API
LEFT JOIN in Azure CosmosDB SQL API
我使用 SQL API 在 Azure Cosmos DB 集合中使用 JOIN 来查询文档。
我有两份联系文件,一份有属性地址,一份没有地址。
我需要获取所有人的地址列表(包括没有地址的人)。我使用下面的查询来做到这一点。
但是它给出了有地址的人列表。
有什么方法可以做 LEFT JOIN 吗?
查询:
SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson
base JOIN Address IN base.Address
示例文档:
[
{
"FirstName": "Saravana",
"LastName": "Kumar",
"Address": [
{
"City": "aaaa"
},
{
"City": "bbbb"
}
]
},
{
"FirstName": "Jayanth",
"LastName": "T"
}
]
预期输出:
[
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "aaa"
},
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "bbbb"
},
{
"FirstName": "Jayanth",
"LastName": "T"
}
]
实际输出:
[
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "bbbb"
},
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "bbbb"
}
]
据我所知,到目前为止,cosmos db 不支持左连接,你可以投票支持这个 thread。
作为解决方法,我建议您在存储过程中使用 2 个不同的 sql,然后将结果合并到其中。
1.SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)
2.SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address
SP:
function sample() {
var collection = getContext().getCollection();
var array = [];
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address',
function (err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
array.push(feed);
}
});
var isAccepted1 = collection.queryDocuments(
collection.getSelfLink(),
'SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)',
function (err, feed1, options) {
console.log(222)
if (err) throw err;
if (!feed1|| !feed1.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
array.push(feed1);
}
});
var response = getContext().getResponse();
response.setBody(array);
if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
您可以根据需要调整输出格式。
那就别加入了。您可以直接访问地址字段。例如:
SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base
如果没有 属性
,它只会显示 null 或空字符串
可以用EXISTS语句模拟LEFT JOIN。例如:
SELECT VALUE c
FROM c
WHERE (
--Like a "Left Join SomeCollection"
(NOT IS_DEFINED(c.SomeCollection) OR c.SomeCollection = null)
OR EXISTS (
SELECT null
FROM s IN c.SomeCollection
WHERE s.PropertyName = 'SomeValue'
)
)
--AND/OR Some other c Node conditions
我使用 SQL API 在 Azure Cosmos DB 集合中使用 JOIN 来查询文档。
我有两份联系文件,一份有属性地址,一份没有地址。
我需要获取所有人的地址列表(包括没有地址的人)。我使用下面的查询来做到这一点。 但是它给出了有地址的人列表。
有什么方法可以做 LEFT JOIN 吗?
查询:
SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address
示例文档:
[
{
"FirstName": "Saravana",
"LastName": "Kumar",
"Address": [
{
"City": "aaaa"
},
{
"City": "bbbb"
}
]
},
{
"FirstName": "Jayanth",
"LastName": "T"
}
]
预期输出:
[
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "aaa"
},
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "bbbb"
},
{
"FirstName": "Jayanth",
"LastName": "T"
}
]
实际输出:
[
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "bbbb"
},
{
"FirstName": "Saravana",
"LastName": "Kumar",
"City": "bbbb"
}
]
据我所知,到目前为止,cosmos db 不支持左连接,你可以投票支持这个 thread。
作为解决方法,我建议您在存储过程中使用 2 个不同的 sql,然后将结果合并到其中。
1.SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)
2.SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address
SP:
function sample() {
var collection = getContext().getCollection();
var array = [];
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
'SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base JOIN Address IN base.Address',
function (err, feed, options) {
if (err) throw err;
if (!feed || !feed.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
array.push(feed);
}
});
var isAccepted1 = collection.queryDocuments(
collection.getSelfLink(),
'SELECT base.FirstName, base.LastName FROM ContactPerson base where NOT IS_DEFINED(base.Address)',
function (err, feed1, options) {
console.log(222)
if (err) throw err;
if (!feed1|| !feed1.length) {
var response = getContext().getResponse();
response.setBody('no docs found');
}
else {
array.push(feed1);
}
});
var response = getContext().getResponse();
response.setBody(array);
if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
您可以根据需要调整输出格式。
那就别加入了。您可以直接访问地址字段。例如:
SELECT base.FirstName, base.LastName, Address.City FROM ContactPerson base
如果没有 属性
,它只会显示 null 或空字符串可以用EXISTS语句模拟LEFT JOIN。例如:
SELECT VALUE c
FROM c
WHERE (
--Like a "Left Join SomeCollection"
(NOT IS_DEFINED(c.SomeCollection) OR c.SomeCollection = null)
OR EXISTS (
SELECT null
FROM s IN c.SomeCollection
WHERE s.PropertyName = 'SomeValue'
)
)
--AND/OR Some other c Node conditions