Sql 从联接中删除重复项

Sql 从联接中删除重复项,sql,inner-join,outer-join,cross-join,natural-join,Sql,Inner Join,Outer Join,Cross Join,Natural Join,我现在正在学校学习数据库,但不幸的是,我们的老师根本不喜欢帮助或回答问题。我现在正在做几个Oracle DB练习,遇到了一个我真的不知道如何解决的问题 表1:学生 ID FAMILY NAME FIRST NAME BIRTH DATE IM_DATE FACULTY 表2:LN ID FKBEZ VNR P_DATE GRADE 现在,问题来了 Q1:创建一个SQL查询(联接),该查询将导致重复的行

我现在正在学校学习数据库,但不幸的是,我们的老师根本不喜欢帮助或回答问题。我现在正在做几个Oracle DB练习,遇到了一个我真的不知道如何解决的问题

表1:学生

   ID      FAMILY NAME     FIRST NAME    BIRTH DATE      IM_DATE    FACULTY

表2:LN

   ID    FKBEZ         VNR P_DATE        GRADE

现在,问题来了

Q1:创建一个SQL查询(联接),该查询将导致重复的行。 Q2:将您的查询从Q1更改为现在不会显示任何重复的查询

我的第一个“问题”是,我不能100%确定重复的定义是什么。即使未在SELECT命令中选择,所有列上的内容是否都是100%相同的重复行

例如: 假设我创建了一个查询,并在SELECT命令中选择了“Family Name”和“Age”列,结果如下所示:

Family Name          Age

但他们实际上是两个不同的人,有不同的名字。因为我没有选择名字,所以没有显示,这些行是否符合重复的条件?或者,我通过选择和重复行选择的内容是否重要?如果它们100%相同,则仅符合重复的条件

好的,回到我的问题上来。 对于Q1我选择了一个简单的(内部)连接查询,如下所示

选择S.ID、S.Family_Name、S.First_Name、LN.FKBEZ 来自学生的 加入LN 在S.ID=LN.ID上

FAMILY NAME               FIRST NAME               FKBEZ       (GRADE)

这就是结果。我没有在我的查询中选择“GRADE”,但我也为您列出了它,这样您可以更好地理解我的问题。 现在,由于我没有在查询中选择“等级”,所以我认为行1 + 2是重复的,因为它们在每个<强>可见/强>列中是相同的。然后我继续到Q2,使用了完全相同的查询,只是这次使用了自然连接(因为这将消除所有重复的行),但结果完全相同

所以现在我的结论是,只有在每个可见的不可见的列上的行100%相同时,才认为它们是重复的。 但现在我实际上完全被难住了,因为我不知道如何解Q1+Q2

重要的是要知道,我们不应该使用单独的或分组的方法来解决这些问题。只有(不同类型的)连接、相交、并集和负数

我想你们可以看到,我在撰写这篇文章上花了很多时间和精力,所以如果你们能帮我完成这篇文章,我将非常感激


谢谢。

尝试使用左连接。第二个表中没有相应的记录具有空值。锿。从t1、t2中选择*其中t1向左连接t2。t2上的不匹配值将为空

请尝试使用左连接。第二个表中没有相应的记录具有空值。锿。从t1、t2中选择*其中t1向左连接t2。t2上的不匹配值将为空

基于您在提问时表现出的理解,我不太确定课堂是否会帮助您。我认为您需要提醒您的讲师进行一些澄清。你至少可以问他关于你的第一个“答案”,在这里你只是包括/排除列,或者可能在连接中添加列。您必须保留非复制行吗?一个
UNION
将为您执行一个
DISTINCT
,所以这是一种欺骗。您可以获得最大/最小值,而无需显式添加
GROUP BY
子句(也可作弊)<代码>交集/
减号
处理集合,因此将有助于保留/删除所有行,除非先对它们进行重复数据消除<代码>自然连接=
连接
w/条件,几乎……我是个白痴,我忘了有一种方法可以用
左连接
s(在任何RDBMS中都有效)实现这一点。查看SO,了解如何查找/删除重复项或在[Best-n-per-group]中查找/删除重复项。不过,这不是直观的,所以人们通常需要向他们指出。根据你在提问时表现出的理解,我不太确定这门课是否会帮助你。我认为你需要让你的导师澄清一下。你至少可以问他关于你的第一个“答案”,在这里你只是包括/排除列,或者可能在连接中添加列。您必须保留非复制行吗?一个
UNION
将为您执行一个
DISTINCT
,所以这是一种欺骗。您可以获得最大/最小值,而无需显式添加
GROUP BY
子句(也可作弊)<代码>交集/
减号
处理集合,因此将有助于保留/删除所有行,除非先对它们进行重复数据消除<代码>自然连接=
连接
w/条件,几乎……我是个白痴,我忘了有一种方法可以用
左连接
s(在任何RDBMS中都有效)实现这一点。查看SO,了解如何查找/删除重复项或在[Best-n-per-group]中查找/删除重复项。不过,这不是直观的,所以人们通常需要向他们指出它。您正在混合连接样式,也可以使用
。。。从t1向左连接t2到…
。。。从t1到t2,其中…
。对不起,这是“惯例”。在t1.column=t2.column上选择*from t1 join t2.
LEFT join
internal join
,不管怎样,他的问题其实并不在于join的类型……你是在混合join样式,也可以选择
。。。从t1向左连接t2到…
。。。从t1到t2,其中…
。对不起,这是“惯例”。在t1.column=t2.column上选择*从t1连接t2。
左连接
内部连接
,不管怎样,他的问题并不是真正的连接类型。。。
Family Name          Age
Miller               20
Miller               20
FAMILY NAME               FIRST NAME               FKBEZ       (GRADE)
Lehmann                   Heini                     DB1          4,7 
Lehmann                   Heini                     DB1            5 
Lehmann                   Heini                     PR1            3 
Huber                     Sven                      DB1          3,7 
Meier                     Swantje                   DB1          1,7 
Meier                     Swantje                   DB2          3,7 
Tunix                     Ole                       PR1            2 
Kannix                    Peter                     DB1            5 
Lehmann                   Heini                     DB2          1,3 
Lehmann                   Heini                     PR2          2,3