4

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

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.

我完全偏离轨道了吗?有人可以帮忙吗?

4

8 回答 8

6

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

更改where ssn =where ssn in和。where companyid =_where companyid in

于 2010-03-12T05:16:20.623 回答
2

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

尝试将您的查询更改为此

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

于 2010-03-12T05:17:14.367 回答
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'
于 2010-03-12T05:25:31.853 回答
1

您应该Inwhere条件中使用,因为它(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');
于 2010-03-12T05:16:45.230 回答
0

理想情况下,使用s 的OMG Ponies的答案。但是,如果您出于某种原因 不喜欢s,那么应该为您解决问题:JOIN
JOINTOP 1

SELECT  name 
FROM    Company 
WHERE   companyid =(SELECT  TOP 1 companyid  
                    FROM    Employment 
                    WHERE   ssn = ( SELECT  TOP 1 ssn 
                                    FROM    Person 
                                    WHERE   countryofbirth = 'Mexico');
于 2010-03-12T06:25:33.797 回答
0

尝试使用IN而不是=

当你写:

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

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

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

select a from T where a IN ( select....)
于 2010-03-12T05:16:17.257 回答
0

看看这是否有效

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

于 2010-03-12T05:18:22.680 回答
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
            )
于 2010-03-12T05:20:22.663 回答