2

我目前正在学校学习数据库,但不幸的是,我们的老师根本不喜欢帮助或回答问题。我目前正在做一些 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 选择的内容无关紧要,并且重复的行只有在它们 100% 相同的情况下才有资格作为重复项?

好吧,回到我的问题。对于Q1,我选择了一个简单的 (INNER) JOIN 查询,如下所示

SELECT S.ID, S.Family_Name, S.First_Name, LN.FKBEZ FROM Students S JOIN 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 

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

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

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

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

谢谢。

4

1 回答 1

-1

尝试使用左连接。第二个表中没有相应的记录将具有空值。埃斯。Select * from t1,t2 where t1 left join t2. t2 上的非匹配值将为空

于 2014-06-15T12:36:50.057 回答