Удалить дубликаты из 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 будут нулевыми