Sql 如何处理Oracle中返回多行的子查询?
我正在为我的项目编写一个有点复杂的查询,我有两个如下所示的表test,test_Av 测试: 试验室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
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