1

これが私のコードです。すべての部門の給与が最も低い教員のフルネームと給与が必要です。サブクエリは単独で動作しますが、残りを連携させることができません。

SELECT CONCAT(FName,' ',LName) AS 'Faculty',DepartmentID,Salary
FROM Faculty,
(SELECT DISTINCT DepartmentID AS 'Department', MIN(Salary) AS 'MinSalary'
FROM Faculty GROUP BY DepartmentID)
WHERE Faculty.DepartmentID= 'Department' AND Salary= 'MinSalary'
ORDER BY DepartmentID
4

6 に答える 6

3

サブクエリにエイリアスを追加する必要があります

SELECT CONCAT(FName,' ',LName) AS 'Faculty',DepartmentID,Salary
FROM   Faculty,
       (
        SELECT DISTINCT DepartmentID AS 'Department', 
               MIN(Salary) AS 'MinSalary'
        FROM Faculty GROUP BY DepartmentID
       ) xx    -- <<< this is the alias. (Don't forget this)
WHERE Faculty.DepartmentID= 'Department' AND Salary= 'MinSalary'
ORDER BY DepartmentID

xx上記の例のサブクエリの名前です。(そして、クエリはあなたが望む結果を与えていないと思います

パフォーマンスを向上させるためにクエリを変更するには (機能のために使用していると仮定しますMYSQLCONCAT)

SELECT  CONCAT(a.FName,' ',a.LName) AS FacultyName,
        a.DepartmentID,
        a.Salary
FROM   Faculty a
        INNER JOIN
       (
        SELECT DepartmentID , 
               MIN(Salary) AS MinSalary
        FROM Faculty 
        GROUP BY DepartmentID
       ) xx    -- <<< this is the alias.
        ON  a.DepartmentID = xx.DepartmentID AND
            a.Salary = xx.MinSalary
-- WHERE .. (add extra condition here)
ORDER BY DepartmentID

SQLFiddle デモ

更新 1

それもあるかもしれませんSQL Server 2012。(すでにサポートしていますCONCAT()

SELECT CONCAT([FName], ' ',[LName]) FullName, [DepartmentID], [Salary]
FROM
  (
    SELECT [FName], [LName], [DepartmentID], [Salary],
            ROW_NUMBER() OVER (partition BY DepartmentID
                              ORDER BY Salary) rn
    FROM Faculty
  ) x
WHERE x.rn = 1

SQLFiddle デモ

于 2012-10-27T05:03:10.077 に答える
2

タイトルのエラー メッセージが示すように、標準 SQL では FROM 句のサブクエリに名前が必要です。また、テーブル名のコンマ区切りリストではなく、JOIN 表記の使用法も学ぶ必要があります。それを認識するには、古い (SQL92 より前の) 表記法を知っている必要があります。自分で使用しないでください。

SELECT CONCAT(F.FName, ' ', F.LName) AS 'Faculty', F.DepartmentID, F.Salary
  FROM Faculty AS F
  JOIN (SELECT DISTINCT DepartmentID AS 'Department', MIN(Salary) AS 'MinSalary'
          FROM Faculty
         GROUP BY Department) AS D
    ON F.DepartmentID = D.Department AND F.Salary = D.MinSalary
 ORDER BY F.DepartmentID;
于 2012-10-27T05:06:02.827 に答える
0

クエリにはサブクエリのエイリアスが必要です

select
    concat(F.FName, ' ', F.LName) as Faculty,
    F.DepartmentID,
    D.MinSalary
from faculty as F
    inner join
    (
        select T.DepartmentID, min(T.Salary) as MinSalary
        from Faculty as T
        group by T.DepartmentID
    ) as D on D.DepartmentID = F.DepartmentID and D.MinSalary = F.Salary
order by F.DepartmentID
于 2012-10-27T05:05:27.910 に答える
0

テーブルとサブセレクト クエリ テーブルの両方にエイリアスを使用することをお勧めします。

    SELECT CONCAT(F.FName,' ',F.LName) AS Faculty,F.DepartmentID, F.Salary
    FROM Faculty F,
     (SELECT DISTINCT DepartmentID AS Department, MIN(Salary) AS MinSalary
      FROM Faculty GROUP BY DepartmentID) AS DEP_MIN_SALARY
    WHERE F.DepartmentID= DEP_MIN_SALARY.Department 
          AND F.Salary= DEP_MIN_SALARY.MinSalary
    ORDER BY FDepartmentID;

1 つの観察:派生テーブルから列を取得していません。それが意図的なものであることを願っています。

于 2012-10-27T05:05:45.257 に答える
0

派生テーブルには、エラー メッセージが訴えている名前が必要です (以下をYouNeedToPutATableAliasHere参照)。

SELECT CONCAT(FName,' ',LName) AS Faculty,DepartmentID,Salary
FROM Faculty,
(SELECT DISTINCT DepartmentID AS Department, MIN(Salary) AS MinSalary
FROM Faculty GROUP BY DepartmentID) AS YouNeedToPutATableAliasHere
WHERE Faculty.DepartmentID= 'Department' AND Salary= MinSalary
ORDER BY DepartmentID

意味をなさない単一引用符もいくつか削除したことに注意してください。(おそらく、列名の二重引用符、角括弧、またはバッククォートを意味していましたが、単一引用符はおそらく機能しません。「Department」についても同じことをする必要があるかもしれません?)


2 つのテーブルを関連付ける条件を指定しない限り、デカルト結合も作成します。「学部で最低給与の教員」のより良いクエリは次の'Department'ようになります (冗長な GROUP BY を削除したことに注意してください)。

SELECT CONCAT(FName,' ',LName) AS Faculty,F.DepartmentID,F.Salary
FROM Faculty F
INNER JOIN (
    SELECT DepartmentID, 
    MIN(Salary) AS MinSalary
    FROM Faculty 
    GROUP BY DepartmentID
) AS MinSal ON MinSal.DepartmentID = F.DepartmentID 
            AND F.Salary = MinSal.MinSalary
WHERE F.DepartmentID= 'Department'
ORDER BY F.DepartmentID

または、1 つの department のみを選択しているため、次の'Department'ようにすることもできます。

SELECT CONCAT(FName,' ',LName) AS Faculty,F.DepartmentID,F.Salary
FROM Faculty F
WHERE F.DepartmentID= 'Department'
AND F.Salary = (
    SELECT MIN(Salary)
    FROM Faculty 
    WHERE DepartmentID = F.DepartmentID
)

または(複数の部門でも機能しますが、結合よりも遅くなる可能性があります):

SELECT CONCAT(FName,' ',LName) AS Faculty,F.DepartmentID,F.Salary
FROM Faculty F
WHERE F.DepartmentID= 'Department'
AND NOT EXISTS(
    SELECT 1
    FROM Faculty FF
    WHERE FF.DepartmentID = F.DepartmentID
    AND FF.Salary < F.Salary
)

実際、元のクエリを見て、@ RichardTheKiwi のコメントを読みながらこの質問を完成させるために、その解釈をこの回答に組み込みます。これは、MySQL を (CONCAT 関数から) 使用しており、列名の前方ティックではなくバックティックを意味していることを前提としています。また、「Department」として指定された学部だけでなく、すべての学部の最低給与教員が必要であると想定しています。ただし、最初に提案したクエリからの小さな変更、つまりWHERE句の削除が必要です。

SELECT CONCAT(FName,' ',LName) AS Faculty,F.DepartmentID,F.Salary
FROM Faculty F
INNER JOIN (
    SELECT DepartmentID, 
    MIN(Salary) AS MinSalary
    FROM Faculty 
    GROUP BY DepartmentID
) AS MinSal ON MinSal.DepartmentID = F.DepartmentID 
            AND F.Salary = MinSal.MinSalary
ORDER BY F.DepartmentID
于 2012-10-27T05:01:27.477 に答える
0
  SELECT CONCAT(F.FName,' ',F.LName) AS Faculty, F.DepartmentID, F.Salary
    FROM Faculty F
    JOIN (
            SELECT DepartmentID,
                   MIN(Salary) AS MinSalary
              FROM Faculty
          GROUP BY DepartmentID
         ) G
      ON F.DepartmentID = G.DepartmentID AND F.Salary = G.MinSalary
ORDER BY F.DepartmentID

エイリアス名を一重引用符で囲む場合の問題は、クエリで明らかなトラップに陥ることです。最初の条件は、 DepartmentID をリテラル'Department'WHEREと照合することです。これは「MinSalary」列にも当てはまります。string

GROUP BY は DISTINCT を必要としないことにも注意してください。これは、DepartmentID の個別の値を既に取得しているためです。

そして、あなたをここに連れてきた最初の問題 - 各派生テーブル (サブクエリとも呼ばれます) にはエイリアス、またはそこから列を識別するための何かが必要です。以下の例では、ON 句の最初の部分が 2 つの列を比較していることがわかりDepartmentIDます。ここでは、2 つを区別するためにエイリアスFとが不可欠であるため、各テーブルにエイリアスを設定する必要があります。G

于 2012-10-27T05:04:16.723 に答える