0

如果我想在 b.int_name 与 c.d_name 或 c.b_name 或 d.syn 匹配时从表 a 和 b 中提取行,以下查询是否正确?

SELECT DISTINCT a.n_id,
                a.dis,
                b.int_name
FROM cdb a,
     ct_int b,
     d_b c,
     d_syn d
WHERE a.dis LIKE '%hunt%' 
     && a.n_id=b.n_id 
     && b.int_name NOT LIKE 'NA' 
     && b.int_type NOT LIKE 'NA' 
     && (b.int_name NOT LIKE c.d_name
     OR b.int_name NOT LIKE c.b_name
     OR b.int_name NOT LIKE d.syn);

此查询执行需要大量时间。如果我给出限制为 10 或 20 的上述查询,它很快就会出现,但没有限制会卡住很长时间,也不知道它是否会给出结果。请在这方面进行指导。提前致谢...

4

1 回答 1

0

首先,编写正确的连接,不使用不推荐使用的语法,它会让你看到你在做什么。

您当前正在连接 4 个表,具有一个良好的连接条件。其余的连接将执行非常糟糕,特别是因为您正在执行看起来像“字符串不像字符串”的连接 - 规范化您的数据并且永远不要在 varchar 上连接,除非您真的必须这样做。其次,NOT LIKE在你的情况下将相当于!=. 用那个。

第二,

&& b.int_name NOT LIKE 'NA' 
&& b.int_type NOT LIKE 'NA' 

可能会更快写成

&& b.int_name != 'NA' 
&& b.int_type != 'NA' 

第三:岗位表结构和预期结果。也许有交叉连接的替代方法。

于 2013-10-16T10:01:11.950 回答