Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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 server 2008 SQL中Equi连接和内部连接的区别_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL中Equi连接和内部连接的区别

Sql server 2008 SQL中Equi连接和内部连接的区别,sql-server-2008,Sql Server 2008,我有两个名为“table123”和“table246”的表格 “表123”列:“ID”、“部门ID”、“名字”、“姓氏”、“薪水”、“地址” “表246”列:“部门ID”、“部门名称” 我想找到每个部门工资最低的员工名单。我可以用两种方法来实现它,一种是相等联接或内部联接。有人告诉我,它们都可以用来提供理想的结果 我使用的查询: 相等连接: SELECT First_Name, b.Dept_Name, alt.Min_Salary AS Min_Salary FROM table123 a,

我有两个名为“table123”和“table246”的表格

表123”列:“ID”、“部门ID”、“名字”、“姓氏”、“薪水”、“地址”

表246”列:“部门ID”、“部门名称”

我想找到每个部门工资最低的员工名单。我可以用两种方法来实现它,一种是相等联接内部联接。有人告诉我,它们都可以用来提供理想的结果

我使用的查询:

相等连接:

SELECT First_Name, b.Dept_Name, alt.Min_Salary AS Min_Salary
FROM table123 a, table246 b,
(SELECT Dept_ID, MIN(Salary)Min_Salary
FROM table123
GROUP BY Dept_ID)alt
WHERE a.Dept_ID = b.Dept_ID
AND a.salary = alt.Min_Salary
AND a.Dept_ID = alt.Dept_ID;
SELECT MIN(Salary)Min_Salary, Dept_Name
FROM table123 a, table246 b
INNER JOIN (SELECT First_Name, MIN(Salary)
FROM table123
GROUP BY Dept_ID)alt
ON b.Dept_ID = alt.Dept_ID;
内部联接:

SELECT First_Name, b.Dept_Name, alt.Min_Salary AS Min_Salary
FROM table123 a, table246 b,
(SELECT Dept_ID, MIN(Salary)Min_Salary
FROM table123
GROUP BY Dept_ID)alt
WHERE a.Dept_ID = b.Dept_ID
AND a.salary = alt.Min_Salary
AND a.Dept_ID = alt.Dept_ID;
SELECT MIN(Salary)Min_Salary, Dept_Name
FROM table123 a, table246 b
INNER JOIN (SELECT First_Name, MIN(Salary)
FROM table123
GROUP BY Dept_ID)alt
ON b.Dept_ID = alt.Dept_ID;
Equi Join语句为我提供了所需的表,其中包含“First_Name”、“Dept_Name”和“Min_Salary”列以及所有相关数据

但是,内部Join语句不会运行,因为First_Name列需要包含在聚合函数或GROUP BY子句中。这真的让我很困惑,因为我不知道如何去修复它。如何调整内部联接查询,以获得与Equi联接查询相同的结果

试试这个:

SELECT a.First_Name, b.Dept_Name, alt.Min_Salary AS Min_Salary
FROM table123 a
INNER JOIN table246 b
    ON a.Dept_ID = b.Dept_ID
INNER JOIN (
            SELECT Dept_ID, MIN(Salary) Min_Salary
            FROM table123
            GROUP BY Dept_ID
           ) alt
    ON b.Dept_ID = alt.Dept_ID
WHERE a.Salary = alt.Min_Salary;

您已经获得了查询的大部分基本部分,这是一个良好的开端。基本规则是,当需要根据条件减少行数时,使用WHERE子句。对于表联接,始终从简单开始,逐个联接每个表并检查结果。希望这有帮助,其中a.Salary=alt.Min_Salary表示只返回“a”中等于“alt”中薪资的薪资。内部联接确保只返回满足此条件的记录。联接的数量取决于所需结果的类型。在本例中,您必须连接table123和table246,因为您需要这两个表中的列。第三次联接是为了导出每个部门ID中的最低工资,然后联接回前两个表。关于点符号(表别名),您可以使用任意一种。它们只是表标签,使语法更漂亮。例如,table123的别名为“a”,table246的别名为“alt”。它们可能分别是“T1”和“T2”,那么最后一个语句将更改为其中T1.Salary=T2.Min_Salary.Yes这是正确的。别担心。我很乐意帮忙。今天晚些时候我会给你回复的。