2011-01-12 7 views
0

Ich bin mir sicher, jemand hat eine bessere Idee so hier geht - Ich habe eine Tabelle mit einer Reihe von IDs (@ tbLink), die Zeilen in anderen Tabellen darstellen. Ich versuche hierCOALESCE funktioniert nicht mit Join

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 

Meine Ergebnisse sind auszudrücken:

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

Aber ich erwartete Reihe 1 ‚Programa‘ nicht ‚Module1‘ zu sein - bin ich etwas fehlt hier? Ist das auch der richtige Gebrauch von COALESCE?

Prost

Mike

+1

Aber row1 hat seine „itemId“ verlinken 1 in @tbModule zu schätzen - und das ist „Module1“. Von dem, was ich sehe, denke ich, alles ist in Ordnung und richtig ... "ProgramA" wäre "itemId = 2" - nein ?? –

Antwort

0

beide Reihen haben eine Artikel-ID von 1.

Ich glaube, Sie sie auf die Kategorie-ID und die Artikel-ID verbinden möchten., Programa ändern a haben programid von 1, und in Ihrem verbinden:

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 
+0

Bingo :) das ist es. Die itemID ist 1, da dieser Wert auf den Wert in tblModule und tblProgram verweist - aber das Hinzufügen des zusätzlichen Joins hat den trick..cheers Scrum Meister erledigt – MikeW

0

vielleicht sollten Sie ein anderes Design betrachten. Fo, was ich denke, Sie könnten diese Änderungen versuchen:

--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 
[email protected] m on m.moduleid = t.itemid 
--left join 
[email protected] p on p.programid = t.itemid