Удалить дубликаты из JOIN

Сейчас я изучаю базы данных в школе, но, к сожалению, наш учитель вообще не любит помогать или отвечать на вопросы. В настоящее время я работаю над парой упражнений по БД Oracle и натолкнулся на один вопрос, который действительно не знаю, как решить.

Таблица 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%, что такое определение дубликата. Являются ли дубликаты строк со 100% идентичным содержимым во ВСЕХ столбцах, даже если вы не выбрали их в команде SELECT?

Пример: скажем, я создал запрос и выбрал столбцы "Фамилия" и "Возраст" в моей команде SELECT, и мой результат выглядит следующим образом:

Family Name          Age

Miller               20
Miller               20

но это на самом деле два разных человека и имеют разные имена. Они квалифицируются как дубликаты, так как я не выбрал имя и, следовательно, он не отображается, или не имеет значения, что я выбираю с помощью SELECT, и дублирующиеся строки квалифицируются как дубликаты, если они на 100% идентичны?

Хорошо, вернемся к моим вопросам. Для Q1 я выбрал простой (INNER) запрос JOIN, похожий на этот

ВЫБЕРИТЕ S.ID, S.Family_Name, S.First_Name, LN.FKBEZ ИЗ СТУДЕНТОВ, СОЕДИНЯЮЩИХСЯ 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" в своем запросе, но я также перечислил его для вас, чтобы вы могли немного лучше понять мой вопрос. Теперь, так как я не выбрал "GRADE" в своем запросе, я бы посчитал строки 1 + 2 дубликатами, потому что они идентичны в каждом видимом столбце. Затем я перешел к Q2 и использовал точно такой же запрос, только на этот раз, используя NATURAL JOIN (поскольку это исключило бы все повторяющиеся строки), но результат был точно таким же.

Итак, теперь я пришел к выводу, что строки считаются дубликатами, только если они на 100% идентичны в каждом видимом и "невидимом" столбце. Но теперь я на самом деле полностью озадачен, потому что я не знаю, как решить Q1 + Q2.

Важно знать, что мы не должны решать эти вопросы, используя DISTINCT или GROUP BY. Только (разные виды) JOINS, INTERSECT, UNION и MINUS.

Я думаю, вы видите, что я потратил много времени и усилий на составление этого поста, поэтому я был бы очень признателен, если вы, ребята, могли бы помочь мне в этом.

Благодарю.

1 ответ

Попробуйте использовать левое соединение. Ни одна соответствующая запись не будет иметь нулевого значения во второй таблице. Es. Выберите * из t1,t2, где осталось t1, присоединитесь к t2. Несоответствующие значения на t2 будут нулевыми

Другие вопросы по тегам