我有两个表需要加入:
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/