Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисляемое поле с объединением значений / 15 сообщений из 15, страница 1 из 1
01.04.2020, 12:53
    #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
01.04.2020, 12:54
    #39942797
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемое поле с объединением значений
MIN()
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.04.2020, 12:58
    #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
01.04.2020, 13:15
    #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
01.04.2020, 13:18
    #39942817
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемое поле с объединением значений
DISTINCT замени на group by 1, 2 и проверь.
Ну и потом добавишь CASE или MINVALUE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
01.04.2020, 13:40
    #39942827
KreatorXXI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемое поле с объединением значений
alekcvp,

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

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

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

Оно не уникальное для конкретной связки a.id и b.id?
...
Рейтинг: 0 / 0
01.04.2020, 14:00
    #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
01.04.2020, 14:02
    #39942841
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемое поле с объединением значений
KreatorXXI
alekcvp

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

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

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

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

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

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

Значит проблем не должно быть. Group by отслеживает как-бы уникальность. Т.е. если у Вас третье поле уникальное для a.id, то не проблема. И тормозить не будет.
...
Рейтинг: 0 / 0
01.04.2020, 14:16
    #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
01.04.2020, 14:42
    #39942863
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вычисляемое поле с объединением значений
В общем всем спасибо, вроде работает как надо.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вычисляемое поле с объединением значений / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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