Sql 如何处理Oracle中返回多行的子查询?

Sql 如何处理Oracle中返回多行的子查询?,sql,oracle,Sql,Oracle,我正在为我的项目编写一个有点复杂的查询,我有两个如下所示的表test,test_Av 测试: 试验室 CREATE table test_AV(id int not null, testid int, name varchar(25), stringvalue varchar(25) ,primary key(id)); INSERT INTO test_AV VALUES(1,1,'latitude','16.15074'); INSERT INTO test_AV VA

我正在为我的项目编写一个有点复杂的查询,我有两个如下所示的表test,test_Av

测试:

试验室

    CREATE table test_AV(id int not null, testid int, name varchar(25),
     stringvalue varchar(25) ,primary key(id));

INSERT INTO test_AV VALUES(1,1,'latitude','16.15074'); 
INSERT INTO test_AV VALUES(2,1,'longitude', '-22.74426'); 
INSERT INTO test_AV VALUES(3,2,'latitude','16.13725'); 
INSERT INTO test_AV VALUES(4,2,'longitude', '-22.85822'); 
INSERT INTO test_AV VALUES(5,3,'latitude','14.85633'); 
INSERT INTO test_AV VALUES(6,3,'longitude', '-24.72379'); 
INSERT INTO test_AV VALUES(7,4,'latitude','14.86949'); 
INSERT INTO test_AV VALUES(8,4,'longitude', '-24.70150'); 
INSERT INTO test_AV VALUES(9,5,'latitude','15.03118'); 
INSERT INTO test_AV VALUES(10,5,'longitude', '-24.32523');
test_AV表中的testid是外键

我需要找到距离给定“纬度”和“经度”100公里半径内的结果来实现这一点,我编写了类似这样的查询

select * from (   SELECT id, 
     title, 
     ((ACOS(
           SIN(16.15074 * 3.141592653 / 180) 
           * SIN((SELECT stringvalue from test_AV WHERE name='latitude')
           * 3.141592653 / 180) 
           + COS(16.15074 * 3.141592653 / 180) 
           * COS((SELECT stringvalue from test_AV WHERE name='latitude') 
           * 3.141592653 / 180)
           * COS((-22.74426 - (SELECT stringvalue from test_AV WHERE name='longitude'))
           * 3.141592653 /180))*6373))    AS distance   FROM
 test ) t where distance <= 100
在子查询中,我需要test_AV表中的所有纬度和经度值来代替subquery,当我写这篇文章时,它表示subquery表示subquery返回多行


如何做到这一点?

正如wildplasser正确提到的,您需要将子查询与主查询关联起来-请参阅下面的查询,注意子查询中的av.testid=ts.id子句:

select * from (   SELECT id,  
 title,  
 ((ACOS( 
       SIN(16.15074 * 3.141592653 / 180)  
       * SIN((SELECT stringvalue from test_AV av WHERE av.testid = ts.id and name='latitude')  
       * 3.141592653 / 180)  
       + COS(16.15074 * 3.141592653 / 180)  
       * COS((SELECT stringvalue from test_AV av WHERE av.testid = ts.id and name='latitude')  
       * 3.141592653 / 180)  
       * COS((-22.74426 - (SELECT stringvalue from test_AV av WHERE av.testid = ts.id and name='longitude'))  
       * 3.141592653 /180))*6373))    AS distance   FROM  
test ts ) t where distance <= 100

现在只需将此表与test连接。

添加一些空格可能会增加问题的可读性。您的子查询从test_AV中选择stringvalue,其中name='latitude'与主查询不相关。您可能需要通过test_id将它们匹配起来。而且lat/lon内容似乎是字符串,因此您依赖于隐式类型强制。非常感谢您的回答,当我尝试上面的querybig查询时Oracle抛出了“invalid number”消息,原因可能是什么?
select * from (   SELECT id,  
 title,  
 ((ACOS( 
       SIN(16.15074 * 3.141592653 / 180)  
       * SIN((SELECT stringvalue from test_AV av WHERE av.testid = ts.id and name='latitude')  
       * 3.141592653 / 180)  
       + COS(16.15074 * 3.141592653 / 180)  
       * COS((SELECT stringvalue from test_AV av WHERE av.testid = ts.id and name='latitude')  
       * 3.141592653 / 180)  
       * COS((-22.74426 - (SELECT stringvalue from test_AV av WHERE av.testid = ts.id and name='longitude'))  
       * 3.141592653 /180))*6373))    AS distance   FROM  
test ts ) t where distance <= 100
select testid,
max(decode(name, 'longitude', to_number(stringvalue), NULL)) longitude,  
max(decode(name, 'latitude', to_number(stringvalue), NULL)) latitude  
from test_AV  
group by testid