2

まず、同様の質問をすでに見ました、それは私の問題とはまったく関係がありませんでした。

次に、これは宿題ですが、質問は SQL 構文に関するものです。クエリは既に作成しており、結果は予想どおりで、順序付けされていません。

第三に、エラーが発生している理由を知っていると思います-サブクエリ(y)(ies)が外側のクエリの順序に影響を与えているため(おそらく)、クエリがネストされている方法に基づいて順序を作成できません.

クエリは次のとおりです。

SELECT DISTINCT E.ssn, E.lname
FROM employee E, works_on W
WHERE E.ssn = W.essn AND
W.pno NOT IN
    (SELECT P.pnumber
    FROM project P
    WHERE P.plocation = 'Houston')
    MINUS
    (SELECT E.ssn, E.lname
    FROM employee E, works_on W, project P
    WHERE E.ssn = W.essn AND
    W.pno = P.pnumber AND
    P.plocation = 'Houston')
ORDER BY E.lname;

SSN       LNAME                                                                 
--------- ---------------                                                       
123456789 Smith                                                                 
453453453 English                                                               
987987987 Jabbar                                                                
999887777 Zelaya

ORDER BY E.lnameクエリの最後から削除すると、正常に実行されます。そうしないと、「無効な識別子」エラーが発生します。これはE.lname、クエリのその時点では何も意味がないためだと思います。

だから私の質問は...どうすれば結果をソートできるような方法でクエリを「ラップ」できE.lnameますか?

すでに 9,000 以上の方法でラップしようとしましたが、うまくいく解決策が見つかりませんでした。私はSQLも初めてなので、現在持っているものよりも少ない量のサブクエリを使用して同じ結果を得るためにクエリの構造を変更できるとは思えません。

時間を割いて私を助けてくれた人に感謝します。テーブル作成コードを提供する必要がある場合は、お知らせください。

4

2 に答える 2

4

私はあなたが9000通りの方法を試したことを知っていますが、どうですか

SELECT ssn,lname from
(
SELECT DISTINCT E.ssn, E.lname
FROM employee E, works_on W
WHERE E.ssn = W.essn AND
W.pno NOT IN
    (SELECT P.pnumber
    FROM project P
    WHERE P.plocation = 'Houston')
    MINUS
    (SELECT E.ssn, E.lname
    FROM employee E, works_on W, project P
    WHERE E.ssn = W.essn AND
    W.pno = P.pnumber AND
    P.plocation = 'Houston')
)
ORDER BY lname;

または序数表記を使用して、

SELECT DISTINCT E.ssn, E.lname
FROM employee E, works_on W
WHERE E.ssn = W.essn AND
W.pno NOT IN
    (SELECT P.pnumber
    FROM project P
    WHERE P.plocation = 'Houston')
    MINUS
    SELECT E.ssn, E.lname
    FROM employee E, works_on W, project P
    WHERE E.ssn = W.essn AND
    W.pno = P.pnumber AND
    P.plocation = 'Houston'

ORDER BY 2;
于 2013-03-29T04:37:17.893 に答える
1

ヒューストンでプロジェクトに取り組んでいる従業員を削除しようとしていますか? 次に、これは次を使用して機能するはずLEFT JOINです:

SELECT DISTINCT E.ssn, E.lname
FROM employee E
   INNER JOIN works_on W 
       ON E.ssn = W.essn AND
   LEFT JOIN project P 
       ON w.pno = p.pnumber AND P.plocation = 'Houston'
WHERE p.pnumber IS NULL
ORDER BY E.lname
于 2013-03-29T04:37:38.500 に答える