您可以将LEFT JOIN 与MATCH 结合使用。将可选的MATCH 放在单独的嵌套查询中。将可选子查询放在LEFT JOIN-clause 中。
查询有点麻烦。主要的graph search pattern 和可选的图形搜索模式需要单独的Node-tables 才能使用图形MATCH-syntax。 Node-table 的第三个实例需要LEFT JOIN 上的可选子句。这第三个Node-table 实例必须与用于MATCH 的主要查询部分的Node-table 分开,因为使用MATCH 需要1table_or_view_name 并且不能使用<joined_table>.
OP 示例没有主图搜索模式,因此使用嵌套的JOIN 几乎没有什么好处。但是,这将是结果查询:
SELECT [pLhs].[name],
[mbox]
FROM [Persons] as [pLhs]
LEFT 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];
一个包含主图搜索模式和可选图搜索模式的更扩展示例更好地演示了图MATCH 与可选LEFT JOIN 的组合。以下使用SQL Graph Sample Database;选择 John 的朋友以及这些朋友喜欢的餐厅:
SELECT [Person].[Name] as friend,
[optionalGsp].[resaurantName],
FROM [Person] AS person1,
[Person] AS person2,
[friendOf],
[Person] AS person2Lhs
LEFT 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) 没有区别。但是,当您删除 Sally 喜欢 Ginger and Spice 时:
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')
带有可选LEFT JOIN 的查询仍将Sally 作为John 的朋友返回。结果显示 NULL 为 Sally 的餐厅。 MATCH(person1-(friendOf)->person2-(likes)->Restaurant) 不显示 Sally。
1MATCH §Arguments 和Use views and table valued functions as node or edge tables in match clauses 描述了对可在MATCH 子句中使用的表的限制。