Sql 这个数据库查询有什么问题?
我在数据库中有以下表格我只列出重要的属性:Sql 这个数据库查询有什么问题?,sql,database,derby,Sql,Database,Derby,我在数据库中有以下表格我只列出重要的属性: Person(ssn,countryofbirth) Parents(ssn,fatherbirthcountry) Employment(ssn, companyID) Company(companyID, name) 我的任务是:给定fatherbirthcountry作为输入,输出出生国与fatherbirthcountry输入匹配的人员所在公司的名称 我假装父亲的祖国是墨西哥,然后这样做: SELECT name FROM Company
Person(ssn,countryofbirth)
Parents(ssn,fatherbirthcountry)
Employment(ssn, companyID)
Company(companyID, name)
我的任务是:给定fatherbirthcountry作为输入,输出出生国与fatherbirthcountry输入匹配的人员所在公司的名称
我假装父亲的祖国是墨西哥,然后这样做:
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.
我完全偏离轨道了吗?有人能帮忙吗?试着用IN代替=
当你写作时:
select a from T where a = ( select....)
子查询必须返回单个值。如果它返回多个值,您将得到错误
为了解决这个问题,我们使用IN运算符,它允许子查询返回一组值>=0,如果a等于这些值中的任何一个,则where条件成功
select a from T where a IN ( select....)
问题是子查询返回多个结果,因此必须使用where in vs.= 将where ssn=更改为where ssn in,where companyid=更改为where companyid in。自选择ssn后,您应该在where条件中使用in 从个人 其中出生国=‘墨西哥’;可能返回多个ssn值
SELECT name
FROM Company
WHERE companyid = (SELECT companyid
FROM Employment
WHERE ssn IN (SELECT ssn
FROM Person
WHERE countryofbirth = 'Mexico');
尝试使用IN关键字not'=' 尝试将您的查询更改为此 选择名称 从公司 其中companyid位于选择companyid 失业 其中,选择ssn中的ssn 从个人 其中出生国=‘墨西哥’ 看看这是否有效 从人员p中选择c.姓名 在p.ssn=e.ssn上左键连接就业e 左加入c公司 e、 CompanyID=c.CompanyID其中 p、 出生国=
错误是由于两个子查询中的一个子查询返回多行。例如,我认为你可能有多个在墨西哥出生的人
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
)
使用:
理想情况下,使用连接的答案。 但是,如果您出于任何原因不喜欢联接,那么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');
当我键入我的答案时,我收到一条消息,6个新答案已经发布。加载新答案?在2分钟内…无论采用何种方法,您都可能希望选择不同的名称…实际上,子查询和联接在SQL Server上使用相同的查询计划。试试看。它可能不会表现得更好,但我觉得它更容易实现read@David我明天会测试,但问题似乎与Derby有关-没有SQL Server。
SELECT name
FROM Company
WHERE companyid =(SELECT TOP 1 companyid
FROM Employment
WHERE ssn = ( SELECT TOP 1 ssn
FROM Person
WHERE countryofbirth = 'Mexico');