CASE возвращает несколько строк - PullRequest
0 голосов
/ 24 января 2019

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

Список приложений может содержать до 100+ приложений, поэтому мне нужно использовать IN.Я не могу изменить ни один из столбцов БД.

http://sqlfiddle.com/#!9/a5a387/5

Любая помощь приветствуется !!!

  CREATE TABLE macs
    (`wsid` int, `mach_name` varchar(20))
;
CREATE TABLE assignments
    (`wsid` int, `adp_id` int)
;
INSERT INTO macs
    (`wsid`, `mach_name`)
VALUES
    (1, 'computer1'),
    (2, 'computer2'),
    (3, 'computer3')
;
INSERT INTO assignments
    (`wsid`, `adp_id`)
VALUES
    (1, '100'),
    (1, '101'),
    (1, '103'),
    (2, '100'),
    (2, '101'),
    (3, '100'),
    (3, '101'),
    (3, '103')
     ;

и запрос:

select mach_name,
CASE
   WHEN b.adp_id in(103) THEN 1 ELSE 0 END
from macs a
left join assignments b on a.wsid = b.wsid

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Вы можете использовать коррелированный подзапрос,

SELECT mach_name, COALESCE((SELECT 1 FROM assignments WHERE wsid=m.wsid AND adp_id=103 LIMIT 1), 0) FROM macs m

затем COALESCE потенциально NULL значение до 0. Это немного компактнее, чем выражение CASE.

Причина, по которой OUTER JOIN возвращает несколько строк, состоит в том, что строки в левой части JOIN могут встречаться несколько раз в правой части. То есть есть только один из каждой машины, но машины могут иметь много назначений. Таким образом, есть несколько строк, содержащих данный компьютер, которые удовлетворяют вашему предикату соединения.

Как ответ CASE, так и мой ответ выбираются из таблицы macs один раз, а результат выбирается в столбце для каждого компьютера.

0 голосов
/ 24 января 2019

Использование exists:

select m.*,
       (case when exists (select 1 from assignments a where a.wsid = w.wsid and a.adp_id in (103)
             then 1 else 0
        end) as flag
from macs m;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...