在简单SQL中由子查询返回的多行

时间:2012-12-04 22:46:21

标签: sql

我有这些表格:

人(pid,姓名,电子邮件,电话,城市)

骑(摆脱,pid,日期,点,开始,目标)[rideID,personID-乘坐的人,斑点=乘坐的开放式插槽,]

参与(pid,rid) - 人pid参加骑车

我必须找到查询 findRidesForUser(pid,date)

它向我提供了所有建议乘坐特定日期的人的详细联系方式,这些日期始于pid所在的城市,例如,ride.start = pid.city。

我正在尝试使用

"SELECT person.name, person.email, person.phone, person.city \
 FROM person WHERE pid=(\
    SELECT pid FROM ride WHERE date='%s' AND \
    ride.start= (SELECT city FROM person WHERE person.pid=pid))"

但它给了我错误: 执行查询时出错:错误:用作表达式

的子查询返回的多行

3 个答案:

答案 0 :(得分:2)

使用person.pid和pid与说1 = 1是一回事。此外,pid =意味着你只需要一个结果,但是你得到的结果更多,所以要么使用top或limit来将子查询限制为1,要么将=更改为“in”。使用in并修复子子查询如下:

"SELECT person.name, person.email, person.phone, person.city \
 FROM person WHERE pid in (\
    SELECT pid FROM ride WHERE date='%s' AND \
    ride.start= (SELECT city FROM person as person1 WHERE person.pid=person1.pid))"

我觉得这是同样的事情

"SELECT person.name, person.email, person.phone, person.city \
 FROM person WHERE pid in (\
    SELECT pid FROM ride WHERE date='%s' AND \
    ride.start= city)"

答案 1 :(得分:2)

您应该在相应的键上加入两个表:

SELECT
    p.name,
    p.email,
    p.phone,
    p.city
FROM person p
JOIN ride r
ON (p.pid = r.pid)
WHERE r.date = 'desiredDate'
AND r.start = (SELECT city FROM person WHERE pid = 'userPid')

其中'desiredDate'和'userPid'是findRidesForUser (pid,date)

的输入参数

答案 2 :(得分:0)

尝试使用“In”代替使用“=”