powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / SQL помощь
25 сообщений из 25, страница 1 из 1
SQL помощь
    #39174352
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Подскажите пожалуйста, во вложении структура таблиц.
Необходимо получить следующий перечень данных Таблица Б.Name, Таблица Б.Number, Таблица А.ID
Если написать селект и связать их по Name получим дублирование Name (Ivan) т.к. в таблице А две записи, но с разными ID.

Как исключить дублирование?
Заранее спасибо.
...
Рейтинг: 0 / 0
SQL помощь
    #39174419
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlstarterКак исключить дублирование?Никак. На приведённых структурах и данных это невозможно.
...
Рейтинг: 0 / 0
SQL помощь
    #39174428
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один раз избавиться от дублей и запретить их вводить на будущее. Потом все остальное делать.
...
Рейтинг: 0 / 0
SQL помощь
    #39174437
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое простое - добавить что-нибудь в названия лишних, например точку, т.е.
NameIDIvan111Ivan.222Petr333
Это чтобы по-быстрому задачу порешать, а потом все равно разбираться и наводить порядок.
...
Рейтинг: 0 / 0
SQL помощь
    #39174671
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В таблице А name это ссылка из таблицы Б
...
Рейтинг: 0 / 0
SQL помощь
    #39174697
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlstarterВ таблице А name это ссылка из таблицы Б
Теорию изучал? Хотя бы читал про нормальные формы? ID (абстрактный ключ) для того и придумано чтобы не заморачиваться с такими проблемами как у тебя. Т.е. "ссылка" это ID а не Name.
Таблица Б должна быть такой
ID Number3211845293
...
Рейтинг: 0 / 0
SQL помощь
    #39174901
AndreyTarasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TsqlstarterВ таблице А name это ссылка из таблицы Б
Теорию изучал? Хотя бы читал про нормальные формы? ID (абстрактный ключ) для того и придумано чтобы не заморачиваться с такими проблемами как у тебя. Т.е. "ссылка" это ID а не Name.
Таблица Б должна быть такой
ID Number3211845293

Таблица А должна быть такой

Не путай человека :-) он и так запутанный
...
Рейтинг: 0 / 0
SQL помощь
    #39174924
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это формализованное представление, на деле действительно в таблице поле Name это ID из таблицы Б, но меняется ли от этого суть?
...
Рейтинг: 0 / 0
SQL помощь
    #39174925
sqlstarterНеобходимо получить следующий перечень данных Таблица Б.Name, Таблица Б.Number, Таблица А.ID
Как исключить дублирование?


А нету там дублирования! А.ID - разные? значит все корректно!
Ошибка в постановке, точнее в том, как Вы постановку задачи нам преподнесли!
...
Рейтинг: 0 / 0
SQL помощь
    #39174929
А так, от диалекта SQL зависит...
В некоторых диалектах можно написать:
Код: sql
1.
 select distinct on (Б.Name)... 


в других так нельзя написать...
...
Рейтинг: 0 / 0
SQL помощь
    #39174934
либо пишите:
Код: sql
1.
2.
3.
select Б.Name, Б.Number, min(А.ID) as ID
....
group by Б.Name
...
Рейтинг: 0 / 0
SQL помощь
    #39174946
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
distinct on как понял под ORACLE не проходит.
А вот за min() спасибо, решение было рядом, спасибо!
...
Рейтинг: 0 / 0
SQL помощь
    #39174970
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlstarterрешение было рядом
Это не решение, а прямой путь к заднице. На каком основании, по какому критерию, выбрано MIN(). Почему не, например, MAX()?

Если связывание выполняется по некоему полю, причём из таблицы берётся только одна запись с таким значением, и не существует критерия выбора одной записи из нескольких - на это поле должно быть наложено требование уникальности.
...
Рейтинг: 0 / 0
SQL помощь
    #39175111
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему же? Если задача взять только одну любую запись, вполне себе решение.
Размышляя далее, если задача усложняет следующим видом (рисунок), в случае если name дублируется, необходимо учитывать только те записи у которых d=1. Решение видимо возможно, как-то через union?
...
Рейтинг: 0 / 0
SQL помощь
    #39175121
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlstarterесли задача усложняет следующим видом (рисунок), в случае если name дублируется, необходимо учитывать только те записи у которых d=1.Задача никак не усложняется. Одно поле или два - какая разница? просто дополнительное условие в секции ON (или WHERE).
...
Рейтинг: 0 / 0
SQL помощь
    #39175129
sqlstarterЕсли задача взять только одну любую запись...

Тогда, ИМХО, более правильным будет решение:
Код: sql
1.
2.
3.
4.
5.
select Б.Name, Б.Number 
form Б
where exists (select А.ID
                   from А
                   where А.Name = Б.Name)
...
Рейтинг: 0 / 0
SQL помощь
    #39175178
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinasqlstarterесли задача усложняет следующим видом (рисунок), в случае если name дублируется, необходимо учитывать только те записи у которых d=1.Задача никак не усложняется. Одно поле или два - какая разница? просто дополнительное условие в секции ON (или WHERE).

Почему же просто условие? Ведь условие " в случае если name дублируется , необходимо учитывать только те записи у которых d=1". Каким образом отсекать по условию в where?
...
Рейтинг: 0 / 0
SQL помощь
    #39175193
sqlstarter Каким образом отсекать по условию в where?
То есть так:
Код: sql
1.
2.
3.
select ....
from Б
inner join A on A.NAME = Б.NAME and A.D = 1


или так:
Код: sql
1.
2.
3.
4.
select ....
from Б
inner join A on A.NAME = Б.NAME 
WHERE A.D = 1
...
Рейтинг: 0 / 0
SQL помощь
    #39192499
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Подскажите пожалуйста, для чего в запросе(oracle 11g) используют плюс (+).
К примеру:
select * from a,b where a.id = b.num(+) and бла бла бла...
...
Рейтинг: 0 / 0
SQL помощь
    #39192589
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sqlstarterДобрый день.

Подскажите пожалуйста, для чего в запросе(oracle 11g) используют плюс (+).
К примеру:
select * from a,b where a.id = b.num(+) and бла бла бла...это ораклевый способ сделать outer join.
...
Рейтинг: 0 / 0
SQL помощь
    #39192766
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
White OwlsqlstarterДобрый день.

Подскажите пожалуйста, для чего в запросе(oracle 11g) используют плюс (+).
К примеру:
select * from a,b where a.id = b.num(+) and бла бла бла...это ораклевый способ сделать outer join. это синтаксис для where.
кслассический join-синтаксис тоже есть: https://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj29840.html
...
Рейтинг: 0 / 0
SQL помощь
    #39192827
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseWhite Owlпропущено...
это ораклевый способ сделать outer join. это синтаксис для where.
кслассический join-синтаксис тоже есть: https://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj29840.html я в чем-то ошибся?
...
Рейтинг: 0 / 0
SQL помощь
    #39192902
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
White OwleNoseпропущено...
это синтаксис для where.
кслассический join-синтаксис тоже есть: https://docs.oracle.com/javadb/10.8.2.2/ref/rrefsqlj29840.html я в чем-то ошибся? да.
во фразе "это ораклевый способ сделать outer join".
ибо не "ораклевый способ", а способ сделать это используя конструкцию where.
...
Рейтинг: 0 / 0
SQL помощь
    #39193782
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
eNoseWhite Owlпропущено...
я в чем-то ошибся? да.
во фразе "это ораклевый способ сделать outer join".
ибо не "ораклевый способ", а способ сделать это используя конструкцию where.Этот синтаксис существует только в Оракл. Придуман на заре СУБД, и сохраняется до сих пор в качестве "legacy".
Да, в дальнейшем Оракл принял на вооружение ANSI JOIN синтаксис, но не уничтожил свой собственный. И сегодня ты можешь использовать оба.

В других СУБД аналогичную задачу решали по другому. В частности в Sybase придумали синтаксис "*=" и "=*", используется точно так же как ораклевый (+), в той же самой where. И означает абсолютно тоже самое.
Но еще раз повторю: синтаксис a.f=b.f(+) это чисто ораклевый способ синтаксического задания outer join.
...
Рейтинг: 0 / 0
SQL помощь
    #39194634
sqlstarter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое за ваши ответы.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / SQL помощь
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]