MySQL Full Outer Join解决方法

时间:2013-03-11 13:21:18

标签: mysql

查询定义:
向我展示所有学生和所有教师,并列出具有相同名字的人。

我希望包括具有相同FirstName的学生和教师。
如果它们被重复多次并不重要。每个学生,教师将分别拥有唯一的StudentID,StaffID。


数据:

Student Table:


StudFirstName 
   David
   John



员工表:

StfFirstName 
  David
  Arnold


预期结果: 大卫


我在互联网上搜索了 Mysql Full Outer Join Workaround
我在下面找到了两种技术。


技术1:使用Union All:

Select Students.StudFirstName
from Students
Left Outer Join Staff
On Students.StudFirstName = Staff.StfFirstName

Union all 

Select Students.StudFirstName 
from Students
Right Outer Join Staff
On Students.StudFirstName = Staff.StfFirstName

where Staff.StfFirstName is null;

技术2:使用Union:

Select Students.StudFirstName
from Students
Left Outer Join Staff
On Students.StudFirstName = Staff.StfFirstName

Union 

Select Students.StudFirstName 
from Students
Right Outer Join Staff
On Students.StudFirstName = Staff.StfFirstName;


技术3:但是我通过使用获得了预期结果 问题3:

Select Students.StudFirstName
from Students,Staff
where Students.StudFirstName = Staff.StfFirstName;


我的问题:
如何使用技术1&获得相同的结果2?

技术1,2和3之间有什么区别,如果它们都给出相同的结果? 什么时候应该使用哪种技术?

2 个答案:

答案 0 :(得分:0)

嗯,前两个是......你想要的(或者似乎想要的)很复杂。

我认为这只是“请求”制定得不好,或者结果不是你所展示的。

  

告诉我所有学生和所有老师,并列出这些   谁拥有相同的名字

应该是,“想要的”结果(如果你只想要“大卫”,你当然不想要“所有的学生和所有的老师”)

  

向我展示学生与教师之间共同的第一名。

然后你的第三个查询就可以了,只需用更合适的语法重写

SELECT DISTINCT s.StudFirstName
FROM Students stu
INNER JOIN Staff sta
  ON stu.StudFirstName = sta.StfFirstName;

SELECT DISTINCT stu.StudFirstName
FROM Students stu
WHERE EXISTS (SELECT NULL
              FROM Staff sta
              WHERE stu.StudFirstName = sta.StfFirstName);

修改 使用DISTINCT避免拥有3个大卫...如果你有3个大卫在学生,只想找回“一个”大卫。你的问题不清楚。还不清楚:如果你在员工表中有3个David,那么可以找到什么......

答案 1 :(得分:0)

了解UnionUnion ALL做什么

<强> Refer this SQL Fiddle

<强> To get result by Technique 2

我真的怀疑你是否可以从技术1 中获得相同的结果

要获得独特的结果,请编辑第三次查询,如下所示:

Select distinct Students.StudFirstName
from Students,Staff
where Students.StudFirstName = Staff.StfFirstName;

将MySQL纳入考虑范围