SQL Join技术

时间:2014-05-09 15:03:02

标签: sql postgresql

我在Bsc上遇到了一些SQL问题。 CS修订试卷 - 我知道你们都不喜欢回答学术问题,但这是我的最后一招(周一考试的修订版),我不知道如何去做。

我有两张桌子:

Department (deptId: string, deptName: string, managerId: string) 
Employee (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 
我需要运行

和2个查询:

1)显示编号最大的部门的名称和ID 员工

2)显示员工平均工资至少的部门名称 40000

我相信我需要在这里使用joinhaving,但这些都是我无法解决的问题。

所以我的问题是,我将如何编写这些查询?我本身并不需要答案,而是知道如何实现目标的解释方法。同样,这不是学术工作,而是期末考试的修订。

5 个答案:

答案 0 :(得分:1)

1

使用Rank并确定谁= 1.为简单起见,请尝试创建子查询:按部门ID分组并获取员工数。

2 - 是的,你需要

Select
    d.deptid, d.deptName, Average(e.salary)
from Department as d
inner join Employee as e
on d.deptId = e.deptId
group by d.deptid, d.deptName
having Average(e.salary) >= 40000

答案 1 :(得分:1)

你必须清楚的事情是2个表连接的内容和方式是什么?

如果您深入了解表结构:

Department 
(deptId: string, deptName: string, managerId: string) 

Employee
 (empId: string, empName: string, jobName: string, salary: integer, deptId: string) 

您可以看到deptId是公共字段,因此是这些表的连接键。 (可能是部门的主键和emmployee的外键)

如果确实是主键,则字符串是最佳datatype选择。

现在,您可以继续进行join query

我想为你的问题提供确切的解决方案我只是给你一个连接语句的语法:

Select * from Table1 join Table2 on Table1.samefield=Table2.samefield  where='condition'

答案 2 :(得分:1)

首先,您希望有一个表格,其中包含来自DepartmentEmployee的信息。这是这些表之间INNER JOIN的经典用例。

  • 您要从这些表中选择哪些列(例如,您真的需要经理ID?)?
  • 你的ON条款是什么?

此时,您将获得一张包含所有员工及其各自部门的表格。

之后,你可以使用这个表和group by,count(),order by,并为你的第一个问题/组选择top 1,为你的第二个问题/ avg()选择。

奖金:现在你可能想知道,如果两个部门有相同数量的员工会怎样?

答案 3 :(得分:0)

首先加入你的两张桌子。

查看结果,看看你需要添加什么。对于第一个想到按某种东西排序可能会选择一定数量的结果。对于第二个,您将不得不为该连接添加一些内容。也许是要聚合的子查询等。

SQL是一种用于试错的漂亮语言。速度快,可立即获得结果。如果您没有环境,请尝试使用SQL Fiddle。

答案 4 :(得分:0)

/*, managerId VARCHAR(100)*/


DECLARE @Department TABLE (deptId VARCHAR(100), deptName VARCHAR(100)) 
DECLARE @Employee TABLE (empId VARCHAR(100), empName VARCHAR(100), jobName VARCHAR(100), salary INT, deptId  VARCHAR(100)) 

INSERT INTO @Department (deptId, deptName) VALUES ('IT','Tech')
INSERT INTO @Department (deptId, deptName) VALUES ('ST','Stores')

INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('A','AAA',10000,'IT')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('B','AAA',20000,'IT')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('C','AAA',30000,'ST')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('D','AAA',220000,'ST')
INSERT INTO @Employee (empId, empName, salary, deptId) VALUES ('E','AAA',12000,'ST')


/*Department with the largest number of employees*/
SELECT  
    TOP 1 DP.deptId, DP.deptName, COUNT(EE.deptId) AS NoEmployees
FROM    
    @Department AS DP 

    INNER JOIN @Employee AS EE
    ON DP.deptId = EE.deptId

GROUP BY
    DP.deptId , DP.deptName
ORDER BY
    COUNT(EE.deptId) DESC

/*Department with the largest number of employees*/
SELECT  
    DP.deptId, DP.deptName, AVG(EE.salary) AS NoEmployees
FROM    
    @Department AS DP 
    INNER JOIN @Employee AS EE
    ON DP.deptId = EE.deptId

GROUP BY
    DP.deptId , DP.deptName
HAVING
     AVG(EE.salary)>40000
ORDER BY
    COUNT(EE.deptId) DESC