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');