2016-12-29 98 views
-2

我们正在使用Oracle数据库处理地理数据。比较两个无关的表sql

有一个称为ST_Insertects(x,y)的函数,如果记录x与y相交,则返回true。

我们正在试图做的是,比较表B中的所有记录表A的每个记录,并检查两个条件

condition 1 : A.TIMEZONE = 1 (Timezone field is not unique) 
condition 2 : B.TIMEZONE = 1 
condition 3 : ST_Intersects(A.SHAPE, B.SHAPE) (Shape field is where the geographical information is stored) 

我们正在寻找的结果是只能从表中的记录一个满足所有三个条件以上

我们试图在这个单一的SELECT语句,但它似乎并没有太大的意义逻辑

+0

有趣。 * 2 *条件是“条件1”,“条件2”和“条件3”?另外,考虑到普通SQL(Oracle实现)不知道布尔数据类型,您如何计划使用函数的返回值?让你的函数返回0或1(NUMBER数据类型)。 – mathguy

回答

0

如果要在Oracle SQL语句中使用函数的返回值,则需要更改函数以返回01(要么'T'/'F' - Oracle数据库支持的某些数据类型,它不支持布尔数据类型)。

,那么你可能要像

select <columns from A> 
from A 
where A.timezone = 1 
    and exists (select * 
       from B 
       where B.timezone = 1 
        and ST_intersects(A.shape, B.shape) = 1 
      ) 
2

伪代码,演示了一个交叉联接:

select A.* 
from 
    tbl1 A, tbl2 B 
where 
    A.TIMEZONE = 1 and 
    B.TIMEZONE = 1 and 
    ST_Intersects(A.SHAPE, B.SHAPE) 

,如果你得到的倍数,你可以把一个独特的,只有选择A.XXX列

随着交叉联接,如果第1行的计算结果为true的行都是这样

a.row1 - b.row1 
a.row1 - b.row2 
a.row1 - b.row3 
a.row2 - b.row1 
a.row2 - b.row2 
a.row2 - b.row3 

所以匹配在多行上,然后在a.Column1上添加一个独特的元素,等等。