我在数据库中有以下表格(我只列出重要的属性):
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.
我完全偏离了轨道吗?有人可以帮忙吗?
答案 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}}