powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисляемое поле с объединением значений
15 сообщений из 15, страница 1 из 1
Вычисляемое поле с объединением значений
    #39942796
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Имеется три таблицы в БД - два справочника и какие-то операции по ним, например:

Код: plaintext
1.
2.
3.
A: ID, ANAME, INFO
B: ID, BNAME, TEXT
C: ID, A_ID, B_ID, OPERATION, DATA, FLAG

Теперь, чтобы отобразить все комбинации А и Б, по которым есть операции, можно использовать простой запрос:
Код: sql
1.
SELECT DISTINCT A.ANAME, B.BNAME FROM C LEFT JOIN A ON C.A_ID = A.ID LEFT JOIN B ON C.B_ID = B.ID;


Вопрос: можно ли как-то в этот запрос добавить вычисляемое поле FLAG, которое равно 0, если хотя бы одна строка в таблице C с данным сочетанием A_ID и B_ID имеет значение FLAG = 0, в противном случае оно равно 1.
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942797
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MIN()
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942801
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

MIN()

Код: sql
1.
SELECT DISTINCT A.ANAME, B.BNAME, MIN(C.FLAG) AS FLAG FROM ..


Так?
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
Invalid token
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942815
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получилось вот так, правильно?
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT A.NAME, B.NAME, 
  (SELECT MIN(FLAG) FROM C WHERE A_ID = A.ID AND B_ID = B.ID) AS FLAG
FROM C 
  LEFT JOIN A ON C.A_ID = A.ID
  LEFT JOIN B ON C.B_ID = B.ID


Или можно это как-то проще сделать, без рекурсии, в один проход?
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942817
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DISTINCT замени на group by 1, 2 и проверь.
Ну и потом добавишь CASE или MINVALUE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942827
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

проверьте, если в таблице "c" вообще нет записей с комбинациями "a.id" и "b.id", то min() всё равно покажет 0?
Мне кажется лучше жёсткая связка. Если в "с" нет записей с какими-то комбинациями, то их и не надо отображать. Хотя это как связаны между собой справочники "a" и "b".
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942830
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
alekcvp,
проверьте, если в таблице "c" вообще нет записей с комбинациями "a.id" и "b.id", то min() всё равно покажет 0?

А такое вообще в принципе может быть, если a.id и b.id берутся из запроса по "c"?

Гаджимурадов Рустам
DISTINCT замени на group by 1, 2 и проверь.
Ну и потом добавишь CASE или MINVALUE.


Спасибо, получилось вот так:
Код: sql
1.
2.
3.
4.
SELECT A.ANAME, B.BNAME, MIN(FLAG) AS FLAG FROM C 
  LEFT JOIN A ON C.A_ID = A.ID
  LEFT JOIN B ON C.B_ID = B.ID
  GROUP BY 1,2



Но! Как только я пытаюсь добавить в запрос ещё одно поле:
Код: sql
1.
SELECT A.ANAME, B.BNAME, A.INFO, MIN(FLAG) AS FLAG FROM C ...


то сразу получаю ошибку, о которой писал выше: "Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)".
Что я не так делаю? Т.е. теоретически понятно, что ругается на то что это не аггрегат и в груп не входит, но как это исправить? В груп я его включить не могу, т.к. поле не уникальное.
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942836
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

а где у Вас из запроса по "с"? У Вас left join. Это означает вывести все строки из левой таблицы. А для правой проставить null'ы для отсутствующих. Или у мня ковид-19?
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942838
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp

Что я не так делаю? Т.е. теоретически понятно, что ругается на то что это не аггрегат и в груп не входит, но как это исправить? В груп я его включить не могу, т.к. поле не уникальное.

Оно не уникальное для конкретной связки a.id и b.id?
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942839
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
alekcvp,
а где у Вас из запроса по "с"? У Вас left join. Это означает вывести все строки из левой таблицы. А для правой проставить null'ы для отсутствующих. Или у мня ковид-19?

Код: sql
1.
SELECT A.ANAME, B.BNAME, MIN(FLAG) AS FLAG FROM C


Ну так левая таблица здесь - это как раз "С", разве нет? Т.е. выводятся все строки из неё.
А в ней у меня не может быть записей, для которых нет соответствующих A.ID и B.ID.
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942841
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
alekcvp

Что я не так делаю? Т.е. теоретически понятно, что ругается на то что это не аггрегат и в груп не входит, но как это исправить? В груп я его включить не могу, т.к. поле не уникальное.

Оно не уникальное для конкретной связки a.id и b.id?

Хм... оно может быть одинаковое для разных a.id... для одного и того же a.id оно всегда одно и то же.
А GROUP BY по многим полям не сильно тормозит запрос?
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942842
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

да, согласен. Прошу прощения. Зачем тогда вообще здесь left? Вывести записи без ссылок на a и b? Такие есть?
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942845
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
KreatorXXI
пропущено...

Оно не уникальное для конкретной связки a.id и b.id?

Хм... оно может быть одинаковое для разных a.id... для одного и того же a.id оно всегда одно и то же.
А GROUP BY по многим полям не сильно тормозит запрос?

Значит проблем не должно быть. Group by отслеживает как-бы уникальность. Т.е. если у Вас третье поле уникальное для a.id, то не проблема. И тормозить не будет.
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942848
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
alekcvp,
да, согласен. Прошу прощения. Зачем тогда вообще здесь left? Вывести записи без ссылок на a и b? Такие есть?

Думаете так будет лучше?..
Код: sql
1.
2.
3.
SELECT A.ANAME, B.BNAME, MIN(FLAG) AS FLAG FROM C, A, B
  WHERE C.A_ID = A.ID AND C.B_ID = B.ID
  GROUP BY 1,2
...
Рейтинг: 0 / 0
Вычисляемое поле с объединением значений
    #39942863
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем всем спасибо, вроде работает как надо.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисляемое поле с объединением значений
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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