我正在尝试确定我们组织中的计算机是否已为其分配了某些应用程序。我遇到的问题是,左联接列出了重复项,列出了每个工作分配,而不是理想情况下列出了计算机名称,如果应用程序被赋予了该名称,则返回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
答案 0 :(得分:1)
使用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;
答案 1 :(得分:0)
您可以使用相关子查询
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
表中选择一次,然后将结果选择到每台计算机的列中。