Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每个派生表都需要一个别名_Sql - Fatal编程技术网

Sql 每个派生表都需要一个别名

Sql 每个派生表都需要一个别名,sql,Sql,这是我的代码,我需要每个系工资最低的教员的全名和工资。我的子查询自己工作,但我无法让其他子查询一起工作 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 Facu

这是我的代码,我需要每个系工资最低的教员的全名和工资。我的子查询自己工作,但我无法让其他子查询一起工作

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

您的派生表需要一个名称,该名称正是错误消息所抱怨的名称。请参见下面的YouneedtoputableAlias:

注意,我还删除了一些对我来说没有意义的单引号。也许您是指列名的双引号、方括号或反勾号,但单引号可能不起作用-您可能需要对“Department”执行相同的操作

除非指定两个表相关的条件,否则也将创建笛卡尔连接。对系“系”中最低工资的教员的更好查询可能是注意,我已通过以下方式删除了冗余组:

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
或者,由于您只选择了一个部门“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
)

您的派生表需要一个名称,该名称正是错误消息所抱怨的名称。请参见下面的YouneedtoputableAlias:

注意,我还删除了一些对我来说没有意义的单引号。也许您是指列名的双引号、方括号或反勾号,但单引号可能不起作用-您可能需要对“Department”执行相同的操作

除非指定两个表相关的条件,否则也将创建笛卡尔连接。对系“系”中最低工资的教员的更好查询可能是注意,我已通过以下方式删除了冗余组:

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
或者,由于您只选择了一个部门“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
)

您需要在子查询上pud别名

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
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
更新1

也可能是SQL Server 2012。已经支持CONCAT


您需要在子查询上pud别名

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
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
更新1

也可能是SQL Server 2012。已经支持CONCAT

在别名周围使用单引号的问题在于,您落入了查询中显而易见的陷阱——第一个条件是将DepartmentID与字符串文字“Department”匹配。这也适用于“MinSalary”专栏

另外值得注意的是,GROUPBY不需要DISTINCT,因为您已经获得了DepartmentID的DISTINCT值

这里的第一个问题是,每个派生表aka子查询都需要一个别名,或者用它来标识其中的列。在下面的示例中,您可以看到ON子句的第一部分比较了两个DepartmentID列。这里必须使用别名F和G来区分这两个表,因此需要对每个表使用别名

在别名周围使用单引号的问题在于,您落入了查询中显而易见的陷阱——第一个条件是将DepartmentID与字符串文字“Department”匹配。这也适用于“MinSalary”专栏

另外值得注意的是,GROUPBY不需要DISTINCT,因为您已经获得了DepartmentID的DISTINCT值


这里的第一个问题是,每个派生表aka子查询都需要一个别名,或者用它来标识其中的列。在下面的示例中,您可以看到ON子句的第一部分比较了两个DepartmentID列。别名F和G在这里是区分这两个的必要条件,因此需要为每个表添加别名。

您的查询需要子查询的别名

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
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

您的查询需要子查询的别名

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
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

最好同时为表和子选择查询表使用别名:

    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;

注意:您没有从派生表中检索任何列。希望这是有意的。

最好对表和子选择查询表使用别名:

    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;

注意:您没有从派生表中检索任何列。希望这是有意的。

作为标题提示中的错误消息,标准SQL要求FROM子句中的子查询具有名称。您还应该学习使用联接符号,而不是逗号分隔的表名列表。您需要知道旧的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;

作为标题提示中的错误消息,标准SQL要求FROM子句中的子查询具有名称。您还应该学习使用联接符号,而不是逗号分隔的表名列表。您需要知道旧的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;

有人投票吗?什么?你至少可以评论一下,这样我就可以改进我的答案了……看起来,我也得到了-1,没有评论。不解释你的想法就否决这个答案不是很勇敢point@RichardTheKiwi谁能说这是个错误呢??这是在原始问题的疑问中有绝对意义的
实际上与“Department”无关,但解释如何修复每个派生表都需要别名错误。注意,我甚至对我的答案做了一些修改,添加了一个解释。我谦恭地完全不同意我原来的答案是错误的,但我希望*除了有帮助之外,我还添加了这些注释和评论。@RichardTheKiwi AFAIK我的答案是/是正确的,除了表中的一个别名,我没有投反对票就更正了它。事实上,当smbd提出一个问题并在不到3分钟的时间内得到5个几乎相同的问题作为答案时,它变得很奇怪:我认为我们需要更复杂的问题:有人投票吗?什么?你至少可以评论一下,这样我就可以改进我的答案了……看起来,我也得到了-1,没有评论。不解释你的想法就否决这个答案不是很勇敢point@RichardTheKiwi谁能说这是个错误呢??在原始问题的查询中,它与“Department”完全无关,但解释如何修复每个派生表都需要别名错误。注意,我甚至对我的答案做了一些修改,添加了一个解释。我谦恭地完全不同意我原来的答案是错误的,但我希望*除了有帮助之外,我还添加了这些注释和评论。@RichardTheKiwi AFAIK我的答案是/是正确的,除了表中的一个别名,我没有投反对票就更正了它。事实上,当smbd提出一个问题并在不到3分钟的时间内得到5个几乎相同的问题作为答案时,它变得很奇怪:我认为我们需要更复杂的问题:谁知道;有一大堆不必要的否决票,我甚至不清楚是谁做的,当然也不清楚为什么。谢谢你的拯救投票,谁知道呢;有一大堆不必要的否决票,我甚至不清楚是谁做的,当然也不清楚为什么。谢谢你的拯救投票。