我有一张桌子products
和一张桌子translations
。我n
为每种产品提供翻译,但始终至少有一个默认翻译(LangID = 0
)。
我想要做的是对用户输入的字符串进行“搜索查询”。如果用户使用某种语言的翻译(例如LangID = 1
),我只想搜索该语言的翻译(默认语言也不是),但是如果没有所需语言的翻译,我想搜索默认翻译。因此,基本上,默认翻译只是一个备用。
我想到的是:
SELECT * FROM products p JOIN translations t ON p.ID = t.ProductID
WHERE (t.LangID = 1 OR (t.LangID = 0 AND NOT EXISTS (SELECT id FROM translations t2 WHERE t2.ProductID = p.ID AND t2.LangID = 1))
AND t.Translation LIKE "Foo%" `
这是最好的方法吗,或者没有嵌套选择就可以做到吗?还是有更好的(性能明智的)查询/方法?
您可以这样执行,但尚不清楚执行计划是好是坏。的组合OR
和EXISTS
不可靠造成一个很好的计划。
只参加两次会更安全,更快捷:
select *
from products p
left join translations t1 on t1.langid = 1 and ...
left join translations t0 on t1.langid is null and t0.langid = 0 and ...
然后,使用t1
它们的值(如果存在)。如果不是,则使用的值t0
。谓词t1.langid is null
是可选的,但是它允许SQL Server(希望)在第一个联接成功的情况下跳过第二个联接。我已经看到了这种模式的工作原理,但是认为它总是有效的并不安全。
这样就得出了可靠而简单的计划。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句