Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите составить SELECT / 15 сообщений из 15, страница 1 из 1
12.10.2016, 16:51
    #39325498
Помогите составить SELECT
Вроде простой запрос, а составить никак.
Есть таблица T1 и таблица T2. У них есть одинаковые внешние ключи FID1 и FID2 на другие таблицы. Нужно выбрать из таблицы T1 записи за минусом записей с такими же FID1 и FID2 из таблицы T2, при чем с меньшим ID (T1).
Т.е. например
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
T1:
ID | FID1 | FID2
1  |  1   |  1
2  |  1   |  1
3  |  2   |  2
4  |  2   |  2
5  |  3   |  3

T2:
FID1 | FID2
 1   |  1
 2   |  2
 3   |  3
 3   |  3


В выборку должны попасть записи с ID = 1 и 3
...
Рейтинг: 0 / 0
12.10.2016, 16:55
    #39325503
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
как пробЫыыывал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.10.2016, 17:03
    #39325509
Помогите составить SELECT
Мимопроходящийкак пробЫыыывал?

Такая глупость приходила в голову:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with
  A (KID1, KID2)
    as
    (select KID1, KID2
     from T1
     order by ID)
select *
from A
rows (select (select count(*) from A) - count(*)
      from T2
      join A on A.KID1 = T2.KID1 and A.KID2 = T2.KID2)
...
Рейтинг: 0 / 0
12.10.2016, 17:05
    #39325511
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
не, с этим не сюда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.10.2016, 17:14
    #39325520
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Проходил_мимо_,

NOT EXISTS
...
Рейтинг: 0 / 0
12.10.2016, 17:15
    #39325524
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Код: sql
1.
2.
3.
4.
select min(id), t1.fid1, t1.fid2
   from t1 left join t2 on t1.fid1=t2.fid1 and t1.fid2=t2.fid2
group by t1.fid1, t1.fid2
having count(distinct t1.id) > 1 or count(t2.fid1) = 0


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.10.2016, 17:19
    #39325526
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Dimitry, тебя Таблоид не укусил ли часом?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.10.2016, 18:30
    #39325586
Помогите составить SELECT
Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
select min(id), t1.fid1, t1.fid2
   from t1 left join t2 on t1.fid1=t2.fid1 and t1.fid2=t2.fid2
group by t1.fid1, t1.fid2
having count(distinct t1.id) > 1 or count(t2.fid1) = 0



Спасибо, что откликнулись.
При группировке теряем одинаковые позиции. Например для такого вида:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
T1:
ID | FID1 | FID2
1  |  1   |  1
2  |  1   |  1
3  |  1   |  1
4  |  2   |  2
5  |  2   |  2
6  |  2   |  2

T2:
FID1 | FID2
 1   |  1
 2   |  2


В выборку должны попасть записи с ID = 1, 2, 4 и 5, а при группировке будут только 1 и 4.
...
Рейтинг: 0 / 0
12.10.2016, 18:34
    #39325592
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Проходил_мимо_,

не фига не ясно по какому критерию у тебя попадают записи с ID = 1, 2, 4 и 5,
...
Рейтинг: 0 / 0
12.10.2016, 18:45
    #39325602
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select tt1.id, tt1.fid1, tt1.fid2
  from
    (select id, fid1, fid2, count(*) over (partition by fid1, fid2) c,
     row_number() over (partition by fid1, fid2 order by id) r) tt1
   join
   (select fid1, fid2, count(*) c from t2 group by fid1, fid2) tt2
    on tt1.fid1=tt2.fid1 and tt1.fid2=tt2.fid2
  where tt1.r <= tt1.c-tt2.c


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.10.2016, 18:46
    #39325605
Помогите составить SELECT
Симонов Денис,
Может так будет понятней:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Из пример №1
T1:                  T2:
ID | FID1 | FID2     FID1 | FID2
1  |  1   |  1        попадает
2  |  1   |  1        1   |  1
3  |  2   |  2        попадает
4  |  2   |  2        2   |  2
5  |  3   |  3        3   |  3

Из пример №2
T1:                  T2:
ID | FID1 | FID2     FID1 | FID2
1  |  1   |  1        попадает
2  |  1   |  1        попадает
3  |  1   |  1        1   |  1
4  |  2   |  2        попадает
5  |  2   |  2        попадает
6  |  2   |  2        2   |  2



Ну или например так: В двух магазинах есть товар. Нужно найти весь товар в первом магазине, которого нет во втором, и брать те единицы товара (если позиции пересекаются), которые поступили раньше. За признак "раньше" вполне сойдет ID.
...
Рейтинг: 0 / 0
12.10.2016, 18:55
    #39325613
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Проходил_мимо_Ну или например так
Постановка задачи - просто мусор. Структура таблиц - тоже. С этим хороших запросов не
сделаешь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.10.2016, 18:57
    #39325615
Помогите составить SELECT
Dimitry Sibiryakov
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select tt1.id, tt1.fid1, tt1.fid2
  from
    (select id, fid1, fid2, count(*) over (partition by fid1, fid2) c,
     row_number() over (partition by fid1, fid2 order by id) r) tt1
   join
   (select fid1, fid2, count(*) c from t2 group by fid1, fid2) tt2
    on tt1.fid1=tt2.fid1 and tt1.fid2=tt2.fid2
  where tt1.r <= tt1.c-tt2.c



Пардон, нужно было написать это раньше: FB 2.5.
Может я зря все это, может нужно сразу ХП написать. Просто задача показалась несложной.
...
Рейтинг: 0 / 0
12.10.2016, 19:08
    #39325627
Помогите составить SELECT
Dimitry SibiryakovПроходил_мимо_Ну или например так
Постановка задачи - просто мусор. Структура таблиц - тоже. С этим хороших запросов не сделаешь.
По поводу структуры: Работаю с чем приходится. Наследство досталось такое.
По поводу постановки: Вытекает из структуры. Для разных магазинов были созданы разные таблицы (возможно разными программистами), товар можно собрать (объединить) только по некоторым признакам. Выборка нужна для отчета.
...
Рейтинг: 0 / 0
12.10.2016, 19:13
    #39325633
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите составить SELECT
Проходил_мимо_,

ты формулируешь задачу не правильно от слова совсем.

Проходил_мимо_Ну или например так: В двух магазинах есть товар. Нужно найти весь товар в первом магазине, которого нет во втором, и брать те единицы товара (если позиции пересекаются), которые поступили раньше. За признак "раньше" вполне сойдет ID.

Читаю. Смотрю в таблицы. Все записи с парой значений (FID1, FID2) из первой таблицы присутствуют во второй.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите составить SELECT / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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