从JOIN中删除重复项

时间:2014-06-15 12:25:28

标签: sql inner-join outer-join cross-join natural-join

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

表1:学生

   ID      FAMILY NAME     FIRST NAME    BIRTH DATE      IM_DATE    FACULTY

  4711    Lehmann          Heini         13.03.89       01.09.08     I         
  4712    Huber            Sven          14.07.89       01.09.08     IWI       
  4713    Meier            Swantje       11.04.88       01.03.09     IWI       
  4714    Tunix            Ole           15.03.88       01.03.09     IWI       
  4715    Kannix           Peter         02.11.89       01.03.09     IWI       
  4716    Weissnix         Axel          15.12.88       01.03.09     IWI     

表2:LN

   ID    FKBEZ         VNR P_DATE        GRADE

  4711   DB1            1 02.02.08        4,7 
  4711   DB1            2 07.07.09          5 
  4711   PR1            1 28.01.09          3 
  4712   DB1            1 02.02.08        3,7 
  4713   DB1            1 02.02.08        1,7 
  4713   DB2            1 02.02.09        3,7 
  4714   PR1            1 28.01.09          2 
  4715   DB1            1 02.02.08          5 
  4711   DB2            1 14.07.09        1,3 
  4711   PR2            1 30.06.09        2,3 

现在,问题就在这里。

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

我的第一个问题'这是我不能100%确定复制的定义是什么。即使您没有在SELECT命令中选择它们,也会在所有列上复制具有100%相同内容的行吗?

实施例: 说我已经创建了一个查询,并且我已经选择了“家庭名称”列。和'年龄'在我的SELECT命令中,我的结果如下所示:

Family Name          Age

Miller               20
Miller               20

但这些实际上是两个不同的人,并且有不同的名字。这些是否有资格作为重复,因为我没有选择名字,因此它没有显示,或者不重要我通过SELECT选择的内容和重复的行只有它们符合重复项#&# 39; 100%完全相同?

好的,回到我的问题。 对于 Q1 ,我选择了一个看起来像这样的简单(INNER)JOIN查询

SELECT S.ID,S.Family_Name,S.First_Name,LN.FKBEZ 来自学生S. 加入LN ON S.ID = LN.ID

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 

这是结果。我还没有选择等级#39;在我的查询中,但我已经为你列出了它,所以你可以更好地理解我的问题。 现在,因为我还没有选择等级'在我的查询中,我认为第1 + 2行是重复的,因为它们在每个可见列中都相同。然后我继续使用Q2并使用完全相同的查询,这次只使用NATURAL JOIN(因为这会消除所有重复的行),但结果完全相同。

所以现在我的结论是,如果行在每个可见'隐藏' 上100%完全相同,则只会被视为重复行柱。 但是现在我真的很难过,因为我不知道如何解决Q1 + Q2。

重要的是要知道,我们不应该使用DISTINCT或GROUP BY来解决这些问题。只有(不同种类)JOINS,INTERSECT,UNION和MINUS。

我想你可以看到我在撰写这篇文章时投入了大量的时间和精力,所以我非常感激,如果你们能帮我解决这个问题。

感谢。

1 个答案:

答案 0 :(得分:-1)

尝试使用左连接。没有相应的记录在第二个表中将具有空值。 ES。从t1,t2中选择*其中t1离开连接t2。 t2上的非匹配值将为null