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?

¿Fue útil?

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 JOINs.
Pero si no te gusta JOINs 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');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top