powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выборка из трехпольной таблицы
12 сообщений из 12, страница 1 из 1
Выборка из трехпольной таблицы
    #37032834
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
День добрый!

Пытаюсь решить такую задачку, уже долго ... Есть табличка из трех полей (все целочисленные),
одно - автоинкрементное (первичный ключ), два других - образуют составной ключ и
одновременно являются внешними ключами по отношению к родительским таблицам .... Табличка
создана для устранения отношения многие-ко-многим (до сих пор не понимаю как эта проблема
решается в постгресе, там недопустимо использовать часть составного ключа в качестве
внешнего ключа)

Задачка состоит в следующем: (пусть поле первичного ключа имеет имя id, двух других Lid и Rid)
Необходимо выбрать из этой таблички по одной и только одной записи для каждого значения
Lid присутствующего в таблице), мож не оч ясно так что пример:

Lid id Rid
1 1 1
1 2 7
1 3 5
2 4 2
2 5 7
3 6 9
4 7 1
4 8 2
4 9 10

В данном случае выборка должна давать (ОДИН ! из допустимых вариантов)

Lid id Rid
1 3 5
2 4 2
3 6 9
4 8 2

Вообщем средствами SELECT c учетом DISTINCT и TOP я не смог найти решения, подскажите
решение ....

Пасиба
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37032840
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_usa__83_,

group by LID тебе поможет
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37032996
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже в твоей задаче не хватает исходных данных. ID - как правило никакой смысловой нагрузки не имеет и какие-либо операции кроме сравнения с ним бессмысленны, поэтому совсем непонятно почему в результат должно попасть именно 1 3 5, а не 1 2 7 например.
Вероятнее всего это определяется данными таблиц, на которые ссылаются LID и RID
т.е. запрос примерно такой должен быть:
Код: plaintext
1.
2.
3.
select CenterTbl.*;
    from center join RightTbl on CenterTbl.RID = RightTbl.RID;
                  join LeftTbl on CenterTbl.LID = LeftTbl.LID;
    where RightTbl.что-то = чему-то and  LeftTbl.что-то = чему-то
где CenterTbl твоя исходная таблица из твоего примера
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033075
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Поясню для чего же это надо.... Пусть LeftTable таблица: Имя_студентки, ID_студентки, RightTable:
Имя_студента, ID_студента, CentralTable Дата_пересыпа, ID_студентки, ID_студента,
ID_записи_о_пересыпе ...

Хотелось бы создать табличку (на основе этих трех) следующего вида
{ID_пересыпа, Имя_студентки, ID_родительской записи, Имя_студента, Дата_пересыпа}

допустим LT:
1 Иванова
2 Петрова
3 Сидорова
4 Забулдыгина

RT:
1 Гаспарян
2 Филюшкин
3 Попкин

CT:
LId Id RId Date

1 1 1 1.01.02
1 2 3 2.01.02
2 3 2 3.01.02
2 4 3 3.01.02
3 5 1 4.02.02
3 6 2 17.09.03
3 7 3 18.12.05

Должно получиться:

1 Иванова 0 Гаспарян 1.01.02
2 Иванова 1 Попкин 2.01.02
3 Петрова 0 Филюшкин 3.01.02
4 Петрова 3 Попкин 3.01.02

и т.д.

Это все для того чтобы можно было отображать все записи о персыпах (в примере)) для
конкретной записи в LT (аналогично и для правой можно создать)
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033079
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igorbik,

Не совсем понял как упорядочение при (склеивании??) поможет отсеить записи с повторяющимися значениями LId
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033082
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

именно поэтому необходимо определить по одной записи для каждого LId чтобы поле ID_родительской сделать 0, все остальные записи для этого значения LId должны иметь в качестве значения ID_родительской RId записи у которой LId тот же а ID_родительской 0
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033369
igorbik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_usa__83_igorbik,

Не совсем понял как упорядочение при (склеивании??) поможет отсеить записи с повторяющимися значениями LId Не упорядочение, а группировка.
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033394
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igorbik,

Согласен, бум дум ....
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033474
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примеры понагляднее оформляй, а то глаза сломать можно. Тэг CSV для этого есть.

LT:
LIDWomen1Иванова2Петрова3Сидорова4Забулдыгина
RT:
RIDMen1Гаспарян 2Филюшкин3Попкин
CT: (Ключевое поле всегда первым пиши, так понятнее)
CIdLIdRIdDate 1111.01.022132.01.023223.01.024233.01.025314.02.0263217.09.0373318.12.05
Должно получиться:
LIDWomenCIdMenDate 1Иванова0Гаспарян1.01.022Иванова2Попкин2.01.023Петрова0Филюшкин3.01.024Петрова4Попкин3.01.02...............
Проверь - правильно я твое повторил, CID в результате вроде неправильно был заполнен
_usa__83_Dima T,

именно поэтому необходимо определить по одной записи для каждого LId чтобы поле ID_родительской сделать 0, все остальные записи для этого значения LId должны иметь в качестве значения ID_родительской RId записи у которой LId тот же а ID_родительской 0
Селектом это сложно сделать, проще сначала сделать выборку:
Код: plaintext
1.
2.
3.
4.
select CT.LID,LT.Women,CT.CId,RT.Men,CT.Date;
   from CT join RT on CT.Rid = RT.Rid;
           join LT on CT.Lid = LT.Rid;
   order by CT.LID;
   into cursor tResult readwrite
а потом доправить ее сканом.

PS Как я понимаю CT.CId надо только тех записей которые последние по дате, поищи в форуме, ВладимирМ несколько раз ссылку на пример такой выборки давал.
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033551
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
igorbik,

пасиб, действительно решается SELECT Lid, max(Cid) from central table group by lid ....
где cid - первичный ключ таблицы centraltable
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033622
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_usa__83_действительно решается SELECT Lid, max(Cid) ...
Легко, просто ... и неправильно, это называется ошибка проектирования.
Как можно сравнивать абстрактные идентификаторы на больше-меньше? Подобные конструкции опираются только на то, что идентификаторы выдаются по возрастанию, т.е. больший идентификатор завели позже, т.е. предполагаем что сортировка по CID совпадает с сортировкой по Date (если Date это дата когда внесли запись).
Но если внесут запись задним числом, то будет выбрана эта запись, а не правильная - более поздняя с меньшим CID.
...
Рейтинг: 0 / 0
Выборка из трехпольной таблицы
    #37033841
_usa__83_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T,

Да, согласен, но в моем случае не принципиально (я писал что должен создать таблицу с parent_id, чтоб можно было
с древовидной структурой одного уровня вложенности работать) а последовательность записей в создаваемой таблице
значения не имеет... В представленном примере (дата была введена для наглядности) надо просто получать список кто
с кем спал (...) и группировать по parent_id...
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Выборка из трехпольной таблицы
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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