您可以合并LEFT JOIN
与MATCH
。将可选的MATCH
置于单独的嵌套查询中。将可选子查询放在JOIN
条款中。
该查询有点麻烦。主要的graph search pattern和可选的图搜索模式需要单独使用-表中的Node
-表。 JOIN
需要第三个Node
-table表的可选子句。这个第三个Node
-table实例必须与Node
-table分开使用,以MATCH
为主要查询部分,因为使用MATCH
需要 a table_or_view_name
并且不能使用<joined_table>
。
OP示例没有主图搜索模式,因此使用嵌套的JOIN
几乎没有什么好处。然而,这将是所产生的查询:
SELECT [pLhs].[name],
[mbox]
FROM [Persons] as [pLhs]
JOIN (
SELECT [pRhs].$node_id AS [pRhsNodeId],
[mbox]
FROM [Persons] as [pRhs]
[PersonMailBoxLink],
[MailBoxes]
WHERE MATCH ([Persons]-([PersonMailBoxLink])->[MailBoxes])
) AS [optionalGsp] ON [pLhs].$node_id = [optionalGsp].[pRhsNodeId];
既具有主图形搜索模式和一个可选的图形搜索图案的更扩展的例子给出具有可选LEFT JOIN
精梳图表MATCH
的一个更好的示范。以下使用SQL Graph Sample Database;选择约翰的朋友和可选的是,这些朋友喜欢的餐馆:
SELECT [Person].[Name] as friend,
[optionalGsp].[resaurantName],
FROM [Person] AS person1,
[Person] AS person2,
[friendOf],
[Person] AS person2Lhs
JOIN (
SELECT person2Rhs.$node_id AS rhsNodeId,
[Restaurant].[Name] AS restaurantName
FROM [Person] AS person2Rhs,
[likes],
[Restaurant]
WHERE MATCH (person2Rhs-(likes)->Restaurant)
) AS optionalGsp
WHERE MATCH (person1-(friendOf)->person2)
AND person1.name = 'John'
AND person2.$node_id = person2Lhs.$node_id
在原有sample database每个人喜欢的餐厅,因此以上和MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
的复杂查询之间没有什么区别。然而,当你删除萨利喜欢生姜和香料:
DELETE FROM likes
WHERE $from_id = (SELECT $node_id FROM Persons WHERE name = 'Sally')
AND $to_id = (SELECT $node_id FROM Restaurants WHERE name = 'Ginger and Spice')
与可选JOIN
查询仍返回萨利作为John
朋友。结果显示Sally's餐厅的NULL
。 MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
不显示莎莉。
MATCH
§ArgumentsUse views and table valued functions as node or edge tables in match clauses和描述上可以在MATCH
-clause被使用的表此限制。