COALESCE не работает с join - PullRequest
       18

COALESCE не работает с join

0 голосов
/ 12 января 2011

Я уверен, что у кого-то есть лучшее представление об этом, так что здесь идет - У меня есть таблица с кучей идентификаторов (@tbLink), которые представляют строки в других таблицах. Я пытаюсь выразить здесь

declare @tbLink table (linkid int, identitytypeid int, 
                      itemid int, categoryid int,parentid int)
declare @tbCat table (categoryid int, name varchar(20))
declare @tbId table (typeid int, typename varchar(20))
declare @tbDomain table (domainid int, domainname varchar(20))
--
declare @tbModule table (moduleid int, modulename varchar(20))
declare @tbProgram table (programid int, programname varchar(20))


INSERT INTO @tbLink VALUES (1, 1, 1, 1, 1)
INSERT INTO @tbLink VALUES (2, 1, 1, 2, 1)

INSERT INTO @tbCat VALUES (1, 'Program')
INSERT INTO @tbCat VALUES (2, 'Module')

INSERT INTO @tbId VALUES (1, 'Domain')
INSERT INTO @tbId VALUES (2, 'Group')

INSERT INTO @tbDomain VALUES (1, 'DEV')

INSERT INTO @tbModule VALUES (1, 'Module1')
INSERT INTO @tbProgram VALUES (2, 'ProgramA')


select t.*, i.typename, c.name, d.domainname, COALESCE(m.modulename, p.programname) 
as objectname from @tbLink t
inner join
@tbId i on t.identitytypeid = i.typeid
inner join
@tbCat c on t.categoryid = c.categoryid
inner join
@tbDomain d on t.parentid = d.domainid
left join
@tbModule m on m.moduleid = t.itemid
left join
@tbProgram p on p.programid = t.itemid

Мои результаты:

1   1   1   1   1   Domain  Program DEV Module1
2   1   1   2   1   Domain  Module  DEV Module1

Но я ожидал, что строка 1 будет 'ProgramA', а не 'Module1' - я что-то здесь упускаю? Это правильное использование COALESCE также?

Приветствия

Mike

Ответы [ 2 ]

0 голосов
/ 24 октября 2013

может быть, вам стоит рассмотреть другой дизайн.Что я могу догадаться, вы можете попробовать эти изменения:

--declare @tbModule table (moduleid int, modulename varchar(20))
--declare @tbProgram table (programid int, programname varchar(20))
declare @tbItems table (itemid int, categoryid int, itemname varchar(20)) 

... 
--INSERT INTO @tbModule VALUES (1, 'Module1')
--INSERT INTO @tbProgram VALUES (2, 'ProgramA')
INSERT INTO @tbItems VALUES (1, 1, 'Module1')
INSERT INTO @tbItems VALUES (1, 2, 'ProgramA')

select t.*, i.typename, c.name, d.domainname, its.itemname 
as objectname from @tbLink t
inner join
@tbId i on t.identitytypeid = i.typeid
inner join
@tbCat c on t.categoryid = c.categoryid
inner join
@tbDomain d on t.parentid = d.domainid
left join @tbItems its on its.categoryid = t.categoryid AND its.itemid = t.itemid 
--@tbModule m on m.moduleid = t.itemid
--left join
--@tbProgram p on p.programid = t.itemid
0 голосов
/ 12 января 2011

обе строки имеют идентификатор элемента 1.

Я думаю, что вы, возможно, захотите присоединиться к ним по идентификатору категории И идентификатору элемента. Измените ProgramA так, чтобы в нем был идентификатор программы, равный 1, и в своем объединении:

left join
@tbModule m on t.categoryid  = 2 AND m.moduleid = t.itemid
left join
@tbProgram p on t.categoryid  = 1 AND p.programid = t.itemid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...