这个数据库查询有什么问题?

时间:2010-03-12 05:11:58

标签: sql database derby

我在数据库中有以下表格(我只列出重要的属性):

Person(ssn,countryofbirth)
Parents(ssn,fatherbirthcountry)
Employment(ssn, companyID)
Company(companyID, name)

我的任务是这样的:给予父亲国家作为输入,输出其国家产品与父亲国家投入相匹配的公司名称。

我假装父亲是墨西哥并且这样做:

SELECT name 
FROM Company 
WHERE companyid = (SELECT companyid  
                   FROM Employment 
                   WHERE ssn = (SELECT ssn 
                                FROM Person 
                                WHERE countryofbirth = 'Mexico');

但它给了我一个错误:

>Scalar subquery is only allowed to return a single row.
我完全偏离了轨道吗?有人可以帮忙吗?

8 个答案:

答案 0 :(得分:6)

问题是您的子查询返回了多个结果,因此您必须使用where in=

where ssn =更改为where ssn in,将where companyid =更改为where companyid in

答案 1 :(得分:2)

尝试使用IN关键字而不是'='。

尝试将您的查询更改为此

SELECT名称 来自公司 在什么地方IN(SELECT companyid
                   来自就业                    WHES ssn IN(SELECT ssn                                 来自人                                 在哪里countryofbirth ='墨西哥');

答案 2 :(得分:2)

使用:

SELECT c.name
  FROM COMPANY c
  JOIN EMPLOYMENT e ON e.companyid = c.companyid
  JOIN PERSON p ON p.ssn = e.ssn
               AND p.countryofbirth = 'Mexico'

答案 3 :(得分:1)

您应该在In条件中使用where,因为(SELECT ssn FROM Person WHERE countryofbirth = 'Mexico');可能会返回多个ssn值。

SELECT name 
FROM Company 
WHERE companyid = (SELECT companyid  
                   FROM Employment 
                   WHERE ssn IN (SELECT ssn 
                                FROM Person 
                                WHERE countryofbirth = 'Mexico');

答案 4 :(得分:0)

尝试使用IN代替=

当你写:

select a from T where a = ( select....)

子查询必须返回单个值。如果它返回多个值,则会出现错误。

为了解决这个问题,我们使用IN运算符,它允许子查询返回一组值(> = 0),如果a等于其中任何一个值,则where条件成功。

select a from T where a IN ( select....)

答案 5 :(得分:0)

看看是否有效

  

SELECT c.Name FROM PERSON p
  LEFT JOIN Employment e ON p.ssn = e.ssn   LEFT JOIN公司c ON   e.CompanyID = c.CompanyID WHERE   p.countryofbirth =

答案 6 :(得分:0)

错误是由于两个子查询中的一个返回多行。我想你可能有很多人在墨西哥出生。

Select Name
From  Companies
Where Exists(
            Select 1
            From Employment
                Join Person
                    On Person.SSN = Employment.SSN
                Join Parents
                    On Parents.SSN = Person.SSN
            Where Parents.FatherBirthCountry = Person.CountryOfBirth
                And Parents.FatherBirthCountry = @InputParam
                And Employment.CompanyId = Companies.CompanyId
            )

答案 7 :(得分:0)

理想情况下,使用JOIN使用JOIN的答案 但是如果你因为某种原因不喜欢TOP 1,那么SELECT name FROM Company WHERE companyid =(SELECT TOP 1 companyid FROM Employment WHERE ssn = ( SELECT TOP 1 ssn FROM Person WHERE countryofbirth = 'Mexico'); 应该为你做到这一点:

{{1}}