Qué hay de malo en esta consulta de base de datos?
Pregunta
Tengo las siguientes tablas en una base de datos (que sólo a enumerar los atributos importantes):
Person(ssn,countryofbirth)
Parents(ssn,fatherbirthcountry)
Employment(ssn, companyID)
Company(companyID, name)
Mi tarea es la siguiente: fatherbirthcountry dado como entrada, salida los nombres de las empresas donde trabajan personas cuyos countryofbirth coincida con la entrada fatherbirthcountry
.pretendo que el fatherbirthcountry es México y hacer esto:
SELECT name
FROM Company
WHERE companyid = (SELECT companyid
FROM Employment
WHERE ssn = (SELECT ssn
FROM Person
WHERE countryofbirth = 'Mexico');
pero me da un error:
>Scalar subquery is only allowed to return a single row.
estoy completamente fuera de la pista? ¿Alguien puede ayudar por favor?
Solución
El problema es que sus subconsultas están regresando varios resultados, así que hay que utilizar where in
vs =
.
Cambiar where ssn =
a where ssn in
y where companyid =
a where companyid in
.
Otros consejos
trate de usar la palabra clave IN no '='.
trate de cambiar su consulta a este
SELECT nombre
de la compañía
DONDE CompanyID IN (SELECT CompanyID
Del empleo
DONDE SSN (SSN SELECT
de persona
DONDE countryofbirth = 'México');
Uso:
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'
Debe utilizar In
en la condición where
ya que el (SELECT ssn
FROM Person
WHERE countryofbirth = 'Mexico');
puede devolver múltiples valores SSN.
SELECT name
FROM Company
WHERE companyid = (SELECT companyid
FROM Employment
WHERE ssn IN (SELECT ssn
FROM Person
WHERE countryofbirth = 'Mexico');
Trate de usar IN
en lugar de =
Cuando se escribe:
select a from T where a = ( select....)
El sub-consulta debe devolver un solo valor. En caso si se devuelve varios valores, se obtiene el error.
Para resolver este utilizamos el operador en la que permite que el sub-consulta para devolver un conjunto de valores (> = 0) y su condición donde tiene éxito si a
es igual a uno cualquiera de esos valores.
select a from T where a IN ( select....)
A ver si esto funciona
SELECT c.Name de persona p
LEFT JOIN Empleo E en p.ssn = e.ssn LEFT JOIN empresa C en e.CompanyID = DONDE c.CompanyID p.countryofbirth =
El error es debido al hecho de que el uno de los dos subconsultas están regresando varias filas. Me gustaría pensar que es probable que usted tiene múltiples personas nacidas en México, por ejemplo.
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
)
Lo ideal es utilizar la respuesta de OMG potros utilizando JOIN
s.
Pero si no te gusta JOIN
s por cualquier razón, entonces TOP 1
debe hacer el truco para usted:
SELECT name
FROM Company
WHERE companyid =(SELECT TOP 1 companyid
FROM Employment
WHERE ssn = ( SELECT TOP 1 ssn
FROM Person
WHERE countryofbirth = 'Mexico');