0

如果可以的话,我正在尝试用更简单的逻辑重写这个块。我在一个更大的SELECT语句中使用它,我认为如果我可以简化这个块,我可能能够提高我的查询性能。

proj_catg_type_id,proj_catg_id并且proj_id都是他们表中的 PK。

select  t1.proj_catg_name
from    table1 t1, table2 t2, table3 t3
where   t2.proj_catg_type_id = t1.proj_catg_type_id
and     t2.proj_catg_type_id = 213
and     t3.proj_id = t2.proj_id
4

3 回答 3

0
select t1.proj_catg_name
from    table1 t1 inner join table2 t2     
on   t2.proj_catg_type_id=t1.proj_catg_type_id
where t2.proj_catg_type_id=213
and t3.proj_id=t2.proj_i

也许?t3 在这个子选择之外使用吗?

于 2013-01-23T19:00:50.467 回答
0

在不了解参照完整性规则和表格背后的逻辑的情况下,很难给出 100% 正确的答案。但只要看看这个陈述,最简化的逻辑就是

select t1.proj_catg_name
from    table1 t1
where   t1.proj_catg_type_id = 213;
于 2013-01-23T19:34:27.037 回答
-2

如果 t3 是您显示的选择之外的表,那么这是一个相关的子查询,您根本不应该使用它!这会将您的查询变成逐行痛苦的行游标。

使用派生表或连接来获取结果。

您没有给我足够的代码来为您的问题编写特定的解决方案,但让我举个例子:

SELECT 
      field1
    , field2
    , (SELECT t3.field3 
        FROM table2 t2 
        JOIN table3 t3 ON t2.id = t3.id
        WHERE t4.somefield = t2.somefield)
FROM table1 t1
JOIn table4 t4 ON t1.id = t4.id

SELECT 
      field1
    , field2
    , t3.field3 
FROM table1 t1
JOIn table4 t4 
    ON t1.id = t4.id
join (SELECT field3 
        FROM table2 t2 
        JOIN table3 t3 ON t2.id = t3.id) a
    ON  t4.somefield = t2.somefield

第一个查询一次运行一行,非常慢。第二个应该给出相同的结果,但以更快的基于集合的方式运行。确保派生表具有别名很重要。您也可以使用 CTE。

于 2013-01-23T20:04:38.333 回答