2017-01-27 2 views
1

У меня есть «сообщение» коллекция в DocumentDb:DocumentDb: может несколько объединений включать пустые наборы

{ 
    Subject: "Foo", 
    To: [ 
    { "Name": "Me", "Address": "[email protected]" } 
    ], 
    Cc: [ 
    { "Name": "You", "Address": "[email protected]" } 
    ] 
} 

и

{ 
    Subject: "Bar", 
    To: [ 
    { "Name": "You", "Address": "[email protected]" } 
    ], 
    Cc: [] 
} 

Я хотел бы, чтобы выбрать все документы, которые «вы @ компания. com 'в качестве адреса To или Cc:

SELECT Message.Subject 
FROM Message 
    JOIN To IN Message.To 
    JOIN Cc IN Message.Cc 
WHERE "[email protected]" IN (To.Address, Cc.Address) 

Это возвращает первый документ, но не второй.

Я считаю, что JOIN Cc in Message.Cc заставляет второй документ удаляться из результатов, потому что он пуст.

Есть ли способ структурировать SQL-запрос для включения второго документа в результирующий набор?

ответ

0

Нет, для этого требуются два запроса (вы можете написать его в одном запросе с помощью пользовательской функции, но этот подход может оказаться неэффективным для использования индекса).

SELECT Message.Subject 
    FROM Message 
    JOIN To IN Message.To 
    WHERE To.Address = "[email protected]" 

    SELECT Message.Subject 
    FROM Message 
    JOIN To IN Message.Cc 
    WHERE Cc.Address = "[email protected]" 

В качестве альтернативы, если у вас есть значения для оба имени и значения, вы могли бы написать:

SELECT Message.Subject 
FROM Message 
WHERE ARRAY_CONTAINS(Message.To, { "Name": "You", "Address": "[email protected]" }) 
OR ARRAY_CONTAINS(Message.Cc, { "Name": "You", "Address": "[email protected]" }) 

Если вы хотите, чтобы это добавляется в запрос DocumentDB, пожалуйста, поддержку/upvote поддержки для подзапросов по адресу https://feedback.azure.com/forums/263030-documentdb/.

+0

У меня есть upvoted запрос подзапроса. Это разумный кандидат для хранимой процедуры? –

+1

Спасибо. Хранимые процедуры имеют ту же проблему, что и UDF, они не смогут использовать индекс. Я бы определенно рекомендовал два запроса - это более легкий, и вы можете даже запускать их параллельно. –