0

查询定义:
显示所有学生和所有教师,并列出同名的人。

我想包括具有相同名字的学生和老师。
它们是否重复多次都没关系。作为每个学生,教师将分别具有唯一的学生ID,员工ID。


数据:

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:使用联合:

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 之间有什么区别?什么时候应该使用哪种技术?

4

2 回答 2

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 个大卫并且只想检索“一个”大卫。不清楚你的问题。也不清楚:如果您在 Staff 表中有 3 个 David,应该检索什么...

于 2013-03-11T13:29:03.090 回答
0

知道什么UnionUnion ALL做什么

请参阅此 SQL Fiddle

通过技术 2 获得结果

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

要获得不同的结果,请像这样编辑您的第三个查询

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

考虑 MySQL

于 2013-03-11T13:36:27.390 回答