Costruisci un join a tre tabelle con un tavolo reclusivo nel mezzo?
-
30-10-2019 - |
Domanda
Ho tre tabelle pertinenti: parti, partgroup e markupgroup.
Le parti sono semplici.
PartID artificial primary key
Part part number
PartGroupID Foreign key
Dati di esempio:
1 T1000 5
2 wizbang gold 17
3 flux capacitor 2
Partgroup è un grafico diretto aciclico (albero) modellato con un tasto genitore autoctonizzato
PartGroupID artificial primary key
Description name of group
ParentID foreign key linked to PartGroupID
MarkupGroupID foreign key linked to MarkupGroup
I dati di esempio sembrerebbero così
1 system null null
2 component null 1
3 software null 2
4 abc 1 3
5 xyz 1 4
6 123 4 null
7 456 4 null
8 789 5 null
9 a1 6 null
10 b2 6 null
11 c3 7 null
12 d4 7 null
13 e5 8 null
14 f6 8 null
15 alpha 3 null
16 beta 3 null
17 gamma 3 null
MarkUpGroup deve applicare un fattore di markup a più parto come set.
MarkupGroupID primary key
MarkupFactor numeric attribute field
Dati di esempio
1 15
2 20
3 25
4 22
Devo scrivere una query che restituisce l'importo del markup appropriato per ciascuna parte nella tabella delle parti. Non c'è mai un caso in cui più di un markup può applicarsi a una parte. Devo ricorrere al grafico per trovare il markup e non lo saprò al momento della query di quanti livelli ho bisogno per ricorrere a trovare un markup non nullo.
Non c'è mai un caso in cui una parte incontrerà più di un possibile unire a un margine sulla strada dell'albero, quindi non c'è accumulazione che deve essere fatto.
Il T1000 è di tipo XYZ, che ha una chiave straniera per un margingroup, quindi possiamo unirci e ottenere un valore. Ha anche un genitore, ma è irrilevante poiché abbiamo il valore di cui abbiamo bisogno.
Wizbang Gold è un software gamma-group, che non ha una chiave straniera, ma il software del nodo principale lo fa e dovremmo restituirlo.
Un condensatore di flusso è un componente e ha una chiave straniera diretta per un roup di marging. Restituire quel valore.
Quindi i risultati sarebbero:
1 T1000 22
2 wizbang gold 20
3 flux capacitor 15
Sono abbastanza sicuro che avrò bisogno di un CTE ricorsivo e un po 'di sapore di applicazione per ottenere questo, ma al momento il mio cervello non funziona molto bene. Se non fosse per la natura ricorsiva della tavola centrale, questo sarebbe piuttosto semplice. La piattaforma è MS-SQL.
Nessuna soluzione corretta