本文介绍了使用视图和表值函数作为匹配子句中的节点或边缘表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我喜欢使用子句的方式与。有没有办法实现这一点?



需要表值函数



可以有各种用例将表值函数或视图用作。例如mine是以下内容。

我有 Node 包含 NVarChar(max)我想要搜索字面文本的字段。我只需要进行平等搜索并且不需要,因此我选择在的文本字段。正如在他的到和。表值函数使用索引;请参阅。

示例数据定义



  CREATE TABLE [Tags](
[tag] NVarChar(max) ,
[tagHash] AS CHECKSUM([Tag])PERSISTED NOT NULL
)as Node;

CREATE TABLE [站点](
[endPoint] NVarChar(max),
[endPointHash] AS CHECKSUM([endPoint])PERSISTED NOT NULL
)as Node ;

CREATE TABLE [Links] as Edge;

CREATE INDEX [IX_TagsByName] ON [Tags]([tagHash]);

GO

CREATE FUNCTION [TagsByName](
@tag NVarChar(max))
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN SELECT
$ node_id AS [NodeId],
[tag],
[tagHash]
FROM [dbo]。[标签]
WHERE [tagHash] = CHECKSUM(@tag)AND
[tag] = @tag;

[TagsByName] 返回,如。但是,真正包含两个内部列,我不知道如何导出。



所需的查询



我想查询类似于以下的数据库:

  SELECT * $ b $ FROM [TagsByName]('important')as t,
[Sites] as s,
[Links] as l
WHERE MATCH([t] - ([l]) - > [s])

然而,导致错误:

我有办法做到这一点吗?






PS。有一些解决方法,但它们看起来不像 MATCH -query;特别是考虑到我的实际查询涉及匹配更多的关系和更多的字符串相等性测试,我会将这些解决方法作为答案发布,并希望有人带来更好的想法。 $ b

解决方案

Workaround

Add the Node table twice to the from clause: once as table and once as table valued function and join them via the $node_id in the where clause:

SELECT *
FROM [TagsByName]('important') as t1,
    [Tags] as t2,
    [Sites] as s,
    [Links] as l
WHERE MATCH ([t2]-([l])->[s]) AND
    t1.[NodeId] = t2.$node_id

Does this affect performance?

这篇关于使用视图和表值函数作为匹配子句中的节点或边缘表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-17 05:53