0

在我的查询中,我想根据字段的值(比如 field1)连接两个表。根据 field1 的值,连接将是:

field3 = field4 OR field5 = field6

就像是

join on    
  CASE FIELD1    
   When 1 THEN FIELD 2 = FIELD3    
   When 2 THEN FIELD 4 = FIELD5    
  END

我现在正在做这样的事情

 .... join on  (field1=1 AND field2=field3) OR (field1=2 AND field4=field5)

但运行查询需要很长时间。这两个条件分别花费不到 7 秒

我怎样才能做到这一点?

4

5 回答 5

2

我强烈建议不要使用这种方法。您正在强制数据库运行无法优化的查询。相反,请查看您的表格,看看是否无法拆分数据,因此不需要此条件。

或者,如果您确实需要这样做,那么最快的方法是运行两个查询和union结果:

select * from table as x where x.field1 = 1 AND x.field2 = x.field3
union [ALL]
select * from table as y where x.field1 = 2 AND y.field4 = y.field5

这应该快得多。

于 2012-09-25T14:01:55.843 回答
1

这需要很长时间,因为 or 不允许您使用索引。我能想到的最简单的解决方案是进行 2 个选择并将它们合并。

select ...
from ...
join ...
   on  (field1=1 AND field2=field3)
union
select ...
from ...
join ...
   on  (field1=2 AND field4=field5)
于 2012-09-25T13:58:33.503 回答
0

连接条件中“或”的问题在于它阻碍了索引的使用并倾向于鼓励嵌套循环连接。我建议做两次加入:

from A left outer join
     B b1
     on a.field2 = b2.field3 left outer join
     B b2
     on a.field4 = b2.field5

左外连接确保您保留所有行。您可以在 SELECT 或 WHERE 子句中执行其他逻辑以获得所需的完整逻辑。

于 2012-09-25T13:57:47.143 回答
0

“运行查询需要很长时间。这两个条件分别花费不到 7 秒”

当您运行单个查询时,数据库可以找出清晰的执行路径。但是对于每个条件,它们将是不同的执行路径。当您尝试结合这两个条件时,数据库不容易协调它们,因此它会做一些缓慢的事情 - 可能是全表扫描。

您如何解决这个问题取决于您对 RDBMS 的风格和许多其他因素。我会让其他人给你一些关于如何解决这个问题的猜测。

于 2012-09-25T13:59:51.820 回答
0
SELECT * 
FROM data_parent
WHERE pid = 
CASE 
WHEN pid =1
THEN (
SELECT id
FROM data_parent, test
WHERE data_parent.pid = test.id
)

data_parent 和 test 是两张表

data_parent 具有列 pid 并且 test 具有列 rpid 作为外键。

这有效并给了我输出。

于 2012-09-25T15:18:50.643 回答