sql - 强制内部查询在外部查询之前执行

标签 sql sql-server tsql join

我有两个表需要加入:

Table VarValues 的字段 Value 是一个 varchar 并且包含自定义属性,这些属性可以是属性类型的 text 和 int

Table Vars 具有属性类型。

表项中有项,特别是一个 ID 和全文索引的数据,我需要搜索。

当我这样查询时:

SELECT 
    distinct SelectedItems.itemid,SelectedItems.fileid
FROM 
    (
        SELECT  [values].itemid, convert(int, [value]) as fileid
        FROM 
            VarValues [values]
            JOIN Vars vars ON [values].VarID = vars. ID
        WHERE
            [type] = 6 --This type is an int
            AND
            [values].[value] <> ''
    ) as SelectedItems
    JOIN containstable(items, *, '<some query>') as items ON SelectedItems.fileid = items.[KEY]

内部查询只返回整数作为 fileid,但是当整个查询运行时我得到一个错误,因为 VarValues 中的第一行包含文本,尽管类型不是 6。

查询优化器是否干扰了我的内部查询?我怎样才能让它停止?还是我这样做完全错了?

最佳答案

优化器可以扩展 View (包括内联 View )并自由决定过滤器顺序。

换句话说,它可能首先执行与全文表的连接,然后在 type = 6 上过滤结果(在您的情况下它似乎正在这样做)。

您可以尝试将 OPTION (FORCE ORDER) 添加到您的查询中,但是,它只能保证连接操作中表的顺序,而不是应用过滤器的顺序。

尝试像这样重写您的查询:

SELECT 
    distinct SelectedItems.itemid,SelectedItems.fileid
FROM 
    (
        SELECT  [values].itemid, CAST(CASE WHEN IsNumeric([value]) = 1 THEN [value] END AS INT) AS field
        FROM 
            VarValues [values]
            JOIN Vars vars ON [values].VarID = vars. ID
        WHERE
            [type] = 6 --This type is an int
            AND
            [values].[value] <> ''
    ) as SelectedItems
    JOIN containstable(items, *, '<some query>') as items ON SelectedItems.fileid = items.[KEY]

关于sql - 强制内部查询在外部查询之前执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5661196/

相关文章:

sql - 使用 HSQLDB 和 Spring 嵌入式数据库启用连接池

SQLCMD、.SQL 文件和 SSIS

PHP-MySQL | PHP-MySQL那么更好/更干净的方式吗?

sql - 将数值转换为日期时间

sql-server - 如何将大型现有数据库(模式)置于源代码控制之下?

sql - 如何使用合并而不是 IS NULL>

sql - 如何将多行变成列

sql-server - 是否可以防止在没有 WHERE 子句的情况下执行 UPDATE 或 DELETE 语句?

sql - 使用数据透视但不聚合将垂直数据转换为水平数据?

SQL Server 更新后触发器不工作