查询定义:
向我展示所有学生和所有教师,并列出具有相同名字的人。
我希望包括具有相同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之间有什么区别,如果它们都给出相同的结果?
什么时候应该使用哪种技术?
答案 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)
了解Union
和Union 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纳入考虑范围