Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2019, 02:44   #1
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию SQL: Объединить результат запроса с другим результатом таблицы

Доброе время суток,
есть запрос:

Код:
select distinct n.ACCOUNTANCY_ID
    from NC n
      where n.DEVICE_ID in (
  select d.ID
      from DEVICES d
        where d.PROPOSAL_ID in (select distinct(ct.PROPOSAL_ID)
                                                   from CROSS_T ct
                                                     where ct.CONTRACT_ID in (select ct.CONTRACT_ID from CROSS_T ct
                                                                                where ct.PROPOSAL_ID in (select ct.PROPOSAL_ID
                                                                                                           from CROSS_T ct
                                                                                                             where ct.CONTRACT_ID = 49)
                                                                                                             and ct.CONTRACT_ID is not null))
        and d.IN_ACCOUNANCY = 2 and d.DEVICES_CL_ID <> -1)
он выдает список ID строк, которые находятся в таблице «ACCOUNTANCY», но в этой таблице могут быть строки не со всеми ID (который выдает запрос).
Вопрос:
Как узнать количество строк, ID которых отсутсвуют в таблице «ACCOUNTANCY»?
Спасибо за ответ.
P.S.:
Самое банальное решение сделать 2 запроса, первый: запрос - который представлен выше, второй: запрос:

Код:
select count(distinct a.ACT_NUMBER)
    from ACCOUNTANCY a
      where a.ID in (‘запрос который представлен выше’)
затем сделать вычитание… но это кажется не совсем правильно.
Можно было бы сделать каккой-нибудь "left join" например, но результат с таблицы, и результат запроса, не очень то "джоинятся".
KBO вне форума Ответить с цитированием
Старый 04.06.2019, 09:54   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

множество where ... in ( select ... )
а это эквивалентно пока конечно без учета distinct ( вроде бы )
Код:
select ct49.PROPOSAL_ID, ctnull.CONTACT_ID,
  ctXXXX.PROPOSAL_ID,  --а для этого нужен distinct ???
  d.ID,
  n.ACCOUNTANCY_ID --и еще раз distinct ???
from CROSS_T ct49
inner join CROSS_T ctnull on ctnull.PROPOSAL_ID = ct49.PROPOSAL_ID
inner join CROSS_T ctXXXX on ctXXXX.CONTACT_ID = ctnull.CONTACT_ID
inner join DEVICES d on d.PROPOSAL_ID = ctXXX.PROPOSAL_ID
inner join NC n on n.DEVICE_ID = d.ID
where ct49.CONTRACT_ID = 49 
  and ctnull.CONTACT_ID is not NULL --а NULL и так будет исключен по inner
и напоследок
Код:
select ct49.PROPOSAL_ID, ctnull.CONTACT_ID,
  ctXXXX.PROPOSAL_ID,  --а для этого нужен distinct ???
  d.ID,  distinct  
  n.ACCOUNTANCY_ID --и еще раз distinct ???
...
так у нас еще ACCOUNTANCTY.
к ПЕРВОМУ запросу (inner БЕЗ dictinct )
Код:
select ...
, a.ID -- сначала для пробы 
-- потом убрав это считаем только по distinct (аналогично ВТОРОМУ запросу сdistinct )
distinct.ID ???
count(distinct a.ID), --ВСЕ из ... //написал и понял что нет( не все а только те что прошли join )
count(distinct ACCOUNTANCTCY_ID)
from ...
...
inner join ACCOUNTANCTY as a on a.ID =d.ACCOUNTANCTCY_ID
ну как-то так.

P.S. кажется пару join CROSS_T ... из первого запроса (и всех последующих) можно достаточно безболезненно убрать, но думать лень.

P.P.S. думаю это можно исправить
Код:
inner join ACCOUNTANCTY as a on a.ID =d.ACCOUNTANCTCY_ID
right join ACCOUNTANCTY as a on a.ID =d.ACCOUNTANCTCY_ID
или вообще начинать join-ить с этой таблицы

вар 2.
Код:
select count(a.ID), -- общее число в таблице
  count(d.ACCOUNTCTY_ID), --число использованных
  count() -count() --ВЫЧИСЛЕННАЯ разность
from ACCOUNTANCTY a
left join ( -- ваш начальный запрос 
             select distinct d.ACCOUNTCTY_ID 
             from ... 
          ) d on d.ACCOUTNTCTY_ID =a.ID
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 04.06.2019 в 10:13.
evg_m вне форума Ответить с цитированием
Старый 05.06.2019, 13:22   #3
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Спасибо за обширный ответ.

Есть такой вариант:
Код:
select count(*)
      from ACCOUNTANCY a
        right join (select distinct n.ACCOUNTANCY_ID
                      from NC n
                        where n.DEVICE_ID in (select d.ID
                                                from DEVICES d
                                                  where d.PROPOSAL_ID in (select distinct(ct.PROPOSAL_ID)
                                                                            from CROSS_T ct
                                                                              where ct.CONTRACT_ID in (select ct.CONTRACT_ID
                                                                                                         from CROSS_T ct
                                                                                                           where ct.PROPOSAL_ID in (select ct.PROPOSAL_ID
                                                                                                                                      from CROSS_T ct
                                                                                                                                         where ct.CONTRACT_ID = 60)
                                                                                                                                         and ct.CONTRACT_ID is not null))
                                                  and d.IN_ACCOUNANCY = 3
                                                  and d.DEVICES_CL_ID <> -1)
                                                ) t
                                                ON a.ID = t.ACCOUNTANCY_ID
          where a.ID is null
он подходит, но не совсем.

Дело в том, что в если в таблице "ACCOUNTANCY" нет строк удовлетворяющих условию (ON a.ID = t.ACCOUNTANCY_ID), и запрос с (join... ) выдает "null", то результатом будет "0", оно правда так, но мне бы хотелось в этом случае получить не "0", а "null"

Последний раз редактировалось KBO; 05.06.2019 в 13:34.
KBO вне форума Ответить с цитированием
Старый 05.06.2019, 14:07   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
но мне бы хотелось в этом случае получить не "0", а "null"
так ведь существует case
обычно его пишут чтобы НЕ получать NULL, но почему нельзя сделать наоборот.
Код:
case when count(*) =0 then NULL else count(*) end
и прочие выкрутасы.
Код:
select case when q =0 then null else q end
from ( select count(*)  q 
         from ....
      )
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 05.06.2019 в 14:11.
evg_m вне форума Ответить с цитированием
Старый 05.06.2019, 14:25   #5
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

да я на case уже смотрю

Подскажите вот например код
Код:
select (case when ct.PROPOSAL_ID is not null
            then '-1'
            else '-2' end)
      from CROSS_T ct
         where ct.CONTRACT_ID = 60
если "ct.PROPOSAL_ID" =4, то результат = "-1" - все норм.

а вот если "ct.PROPOSAL_ID" =null, то результат почему-то "null", а не "-2"?

Последний раз редактировалось KBO; 05.06.2019 в 14:27.
KBO вне форума Ответить с цитированием
Старый 05.06.2019, 14:54   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
а вот если "ct.PROPOSAL_ID" =null, то результат почему-то "null", а не "-2"?
мне это тоже непонятно.
но почему бы не попробовать без not
Код:
case when ... is null then -2 else -1 end
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.06.2019, 15:10   #7
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
но почему бы не попробовать без not
А у вас работает??? (честно говоря уже пробовал)
просто
Код:
select ct.PROPOSAL_ID
      from CROSS_T ct
      where ct.CONTRACT_ID = 560          --result: null
и
Код:
select ct.PROPOSAL_ID
      from CROSS_T ct
        where ct.CONTRACT_ID = 60          --result: 44

то
Код:
select (case when ct.PROPOSAL_ID IS NULL
            then '-1'
            else '-2' end)
      from CROSS_T ct
         where ct.CONTRACT_ID = 560          -- result: null
'NULL'
какая-то охинея, такого быть НЕ МОЖЕТ

Последний раз редактировалось KBO; 05.06.2019 в 15:12.
KBO вне форума Ответить с цитированием
Старый 05.06.2019, 15:21   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Так в колонке null или ни одной записи не вернуло?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 05.06.2019, 15:28   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
ни одной записи не вернуло?
скорее всего именно это.


Цитата:
Сообщение от KBO Посмотреть сообщение
какая-то охинея, такого быть НЕ МОЖЕТ
А такой запрос что возвращает?
Код:
select 1 from CROSS_T ct  where ct.CONTRACT_ID = 560
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.06.2019, 15:41   #10
KBO
Форумчанин
 
Регистрация: 11.06.2010
Сообщений: 525
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
А такой запрос что возвращает?
0 record fetched
Изображения
Тип файла: png Untitled.png (24.2 Кб, 76 просмотров)

Последний раз редактировалось KBO; 05.06.2019 в 15:44.
KBO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
selectfield заполнение результатом запроса dbalor Python 0 20.05.2019 07:57
PostgresSQL. Как работать с результатом запроса Artsiom SQL, базы данных 3 15.11.2016 12:18
Объединить результат двух запросов yulia Microsoft Office Access 12 04.02.2016 20:30
создание таблицы, которая является результатом запроса к двум другим таблицам SergioSS SQL, базы данных 9 06.05.2015 22:38
Проблемка с результатом запроса в БД artemavd БД в Delphi 25 15.06.2009 17:12