2016-12-07 3 views
2

Ich habe eine Schnittstelle, in dem ich eine Liste von Elementen aus einer SQLite Datenbank zeigen, dass jedes Element eines von zwei Typen: SubItem1 und SubItem2. Diese Datenbank hat derzeit drei Tabellen: Elemente, SubItem1 und SubItem2.Optimierung von 2 unabhängiger Tabelle beitreten

Die Tabelle Artikel enthält die Spalten SubItemId und Typ (0 - SubItem1; 2 - SubItem2)

SubItem1 und SubItem2 haben unterschiedliche Spalten, aber eine gute Menge von ihnen sind das Gleiche.

So zu verwenden, um diese Liste füllen ich eine Abfrage wie bin mit:

select i.*, s1.name, s2.name, s1.time, s2.place 
from ITEMS i 
left outer join sub1 s1 on (i.type = 0 and i.sub_id = s1.id) 
left outer join sub2 s2 on (i.type = 1 and i.sub_id = s2.id) 

ich diese Spalten als Beispiel verwendet, aber ich bin die Auswahl um 10 Spalten jeder SubItem Tabelle.

Mit dieser Abfrage bekomme ich viele redundante Zeilen. Zum Beispiel, wenn der Typ SubItem1 für ein bestimmtes Element ist, werde ich auch die Null-Spalten der Tabelle SubItem2 erhalten.

Gibt es eine effizientere Möglichkeit, diese Abfrage zu machen?

Danke.

+0

Beispieldaten und gewünschte Ergebnisse würden erklären, was Sie erreichen möchten. –

Antwort

0

Verwenden COALESCE() für die „gleiche“ Spalt:

select i.*, COALESCE(s1.name,s2.name) as name, 
      COALESCE(s1.col1,s2.col2) as col2, 
      .... 
     s1.time, s2.place 
from ITEMS i 
left outer join sub1 s1 on (i.type = 0 and i.sub_id = s1.id) 
left outer join sub2 s2 on (i.type = 1 and i.sub_id = s2.id) 
0

Sie separat beiden Typen auswählen können mit inneren Joins, und dann mit einem compound query beiden Ergebnisse kombinieren:

SELECT i.*, s.name, s.time, NULL AS place 
FROM Items AS i 
JOIN Sub1 AS s ON i.sub_id = s.id 

UNION ALL 

SELECT i.*, s.name, NULL, s.place 
FROM Items AS i 
JOIN Sub2 AS s ON i.sub_id = s.id; 

diese wahrscheinlich effizienter sein.

+0

Danke, dass Sie meine Meinung über die Verwendung von UNION geäußert haben. Die Ergebnisse zeigten jedoch einen leichten Leistungszuwachs, wenn UNION nicht verwendet wurde. –

Verwandte Themen