2010-03-12 60 views
4

我有一個數據庫下表(我只列出重要的屬性):這個數據庫查詢有什麼問題?

Person(ssn,countryofbirth) 
Parents(ssn,fatherbirthcountry) 
Employment(ssn, companyID) 
Company(companyID, name) 

我的任務是這樣的:給定fatherbirthcountry作爲輸入,輸出的公司裏工作的人,其countryofbirth匹配的名字分娩國家投入。

我假裝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. 

我是完全偏離了軌道?任何人都可以幫忙嗎?

+1

當我輸入我的回答,我得到了「6分新的答案已經發布了消息裝入新。答案?」 (在2分鐘內)... – Amsakanna 2010-03-12 05:21:43

+0

是的,這是德比 – VeePee 2010-03-12 06:21:56

+0

無論你走的是什麼方法,你可能會想'SELECT DISTINCT name ...'。 – pilcrow 2010-03-12 17:23:14

回答

6

的問題是,你的子查詢返回多個結果,所以你必須使用where in=

更改where ssn =where ssn inwhere companyid =where companyid in

+0

非常感謝你。 – VeePee 2010-03-14 05:20:30

0

嘗試使用=IN代替

當你寫:

select a from T where a = (select....) 

子查詢必須返回一個值。如果它返回多個值,你會得到你的錯誤。

爲了解決這個問題,我們使用IN運算符,它允許子查詢返回一組值(> = 0),如果a等於這些值中的任何一個,則條件成功。

select a from T where a IN (select....) 
1

您應該在where條件中使用In,因爲(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'); 
2

嘗試使用IN關鍵字不是'='。

試着改變你的查詢到該

SELECT名 FROM公司 WHERE companyid IN(SELECT companyid
就業 WHERE爲ssn IN(SELECT SSN 由人 WHERE countryofbirth = '墨西哥');

0

看看這個工程

SELECT c.Name FROM PERSON p
LEFT JOIN Employment e ON p.ssn=e.ssn LEFT JOIN Company c ON e.CompanyID=c.CompanyID WHERE p.countryofbirth=

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 
      ) 
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' 
+0

實際上,子查詢和連接在SQL Server上使用相同的查詢計劃。試試看。 – 2010-03-12 05:27:06

+1

它可能不會表現更好,但這是一個hellofalot更容易閱讀 – Dexter 2010-03-12 05:29:00

+0

@David B:我會明天測試,但問題似乎與Derby有關 - 沒有SQL Server。 – 2010-03-12 05:32:46

0

理想的情況下使用使用JOIN期從OMG Ponies答案。
但是,如果你不喜歡JOIN S表示無論什麼原因,然後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');