2016-04-04 18 views
2

Ich versuche, etwas kombiniertes Ergebnis von zwei separaten einzelnen Tabellen zu holen. Die Tabelle transaction_fact hat ungefähr 3,6 Millionen Zeilen und translation_table hat ungefähr 300000 Zeilen. Nun möchte ich eine Summe des Betrags für alle Transaktionen nach Standort und das Produkt in diesem Ort gruppiert. Aber da die Faktentabelle nur eine Orts-ID und Produkt-ID hat und ich die Namen im Ergebnis haben möchte, verwende ich eine Unterabfrage.SQL Unterabfrage going heywire

Meine Frage lautet wie folgt:

SELECT 
     (SELECT translation 
      FROM translation_table 
      WHERE dim_name LIKE 'location_dim' 
      AND lang_id LIKE 'es' 
      AND dim_id LIKE CAST(o.loc_id AS CHAR(50)) 
      AND field_name LIKE 'city') AS Location 
    , (SELECT product_name 
      FROM prod_dim 
      WHERE prod_id = o.prod_id) AS Product 
    , SUM(amount) 
    FROM transaction_fact o 
    GROUP 
     BY loc_id 
     , prod_id 
    ORDER 
     BY loc_id 
     , prod_id; 

Aber diese Abfrage wird nichts zurückkehrte, hält nur auf die Verarbeitung. Ich wartete etwa anderthalb Stunden, aber immer noch kein Ergebnis.

Bitte sagen Sie mir, was schief gehen könnte.

+0

Dies könnte die seltsamste Abfrage sein, die ich seit einer Weile gesehen habe. Wenn Sie möchten, sollten Sie diese einfache Vorgehensweise in zwei Schritten befolgen: 1. Wenn Sie dies noch nicht getan haben, stellen Sie geeignete DDLs (und/oder einen SQL-Server) bereit, damit wir das Problem leichter replizieren können. 2. Wenn Sie dies noch nicht getan haben, geben Sie eine gewünschte Ergebnismenge ein, die den Informationen in Schritt 1 entspricht. – Strawberry

+0

Sie sollten sich die JOINs ansehen –

+0

Das Schema für Tabellen und Spalten ist in den Kommentaren der Antwort 1 angegeben Das gewünschte Ergebnis ist die Summe des Transaktionsbetrags, gruppiert über Standort und Produkt ... dh die Summe des Gesamtbetrags für alle Transaktionen für ein Produkt an einem Standort ... Die Ergebnistabelle sollte folgende Spalten enthalten: Ort | Produkt | Total_amount –

Antwort

0

Durch das Verknüpfen der Tabellen müssen keine Unterabfragen mehr durchgeführt werden und die Leistung steigt. Wenn nicht, müssen Sie möglicherweise weitere Details zur Tabellenstruktur angeben, bevor wir Ihnen helfen können. So etwas sollte Ihnen den Einstieg:

SELECT t.translation AS Location, p.product_name AS Product, SUM(o.amount) AS Total 
FROM transaction_fact o 
    INNER JOIN translation_table t ON CAST(o.loc_id AS char(50)) = t.dim_id 
    INNER JOIN prod_dim p ON p.prod_id = o.prod_id 
WHERE t.dim_name = 'location_dim' 
      AND t.lang_id = 'es' 
      AND t.field_name = 'city' 
GROUP BY t.translation, p.product_name 
ORDER BY o.loc_id, o.prod_id; 

Hinweise: Ich habe die gerne = geändert, wie LIKE für ist, wenn Sie wollen auf einem Muster entsprechen, die Platzhalter enthält.

Die CAST, die in der Verknüpfung zu translation_table verwendet wird, ist nicht ideal. Wenn Sie damit aufhören könnten, würden Sie eine bessere Leistung erzielen.

+1

LIKE spielt auch eine Rolle bei der Sortierung von Groß- und Kleinschreibung. – Strawberry

+0

Interessant, das wusste ich nicht. Vielen Dank. OP, fühlen Sie sich frei, wenn nötig wieder zu LIKE zu wechseln. –

+0

Wäre es nicht eine Verbindung von etwa 3 lac * 3,6 Millionen Zeilen zu filtern? weil die Tabellen, denen wir uns anschließen, jeweils viele Zeilen haben. –