Query als View speichern

Pol

Mitglied
Hallo
Ich habe die folgende Query, welche ich nicht als View in MySql speichern kann, weil es in FROM eine Subquery hat.
Kann jamand hier mir helfen, diese Query für MySQL als View bereitstellen?

Danke
Pol

SELECT view_bsatz.b_id,
view_bsatz.Soll,
view_bsatz.Haben,
view_bsatz.Konto,
view_bsatz.balance,
view_bsatz.GKonto
FROM (SELECT t.*,
@n := If(@g <> Konto, 0, @n) + Coalesce(Soll, 0) - Coalesce(Haben,
0) balance,
@g := Konto
FROM view_bsatz t,
(SELECT @n := 0) n,
(SELECT @g := 0) g
ORDER BY Konto,
b_id) view_bsatz
 
Und hier mal lesbar. SQL-Tags sind Gold Wert
SQL:
SELECT 
    view_bsatz.b_id, 
    view_bsatz.soll, 
    view_bsatz.haben, 
    view_bsatz.konto, 
    view_bsatz.balance, 
    view_bsatz.gkonto 
FROM 
    (
        SELECT 
            t.*, 
            @n : = IF(@g <> konto, 0, @n) + coalesce(soll, 0) - coalesce(haben, 0) balance, 
            @g : = konto 
        FROM 
            view_bsatz t, 
            (SELECT @n : = 0) n, 
            (SELECT @g : = 0) g 
        ORDER BY 
            konto, 
            b_id
    ) view_bsatz

Unabhängig von der View:
item: Du kannst beide Variablen in einem Subselect deklarieren:
(SELECT @n := 0, @g := 0) vars

item:COALESCE() eignet sich, wenn mahr eine ganze Liste von Werten hat. BEi nur 2 Werten, wobei der Zeite den Default-Wert ist, eignet sich IFNULL() fast besser (dürfte auch schneller sein)

item: Wenn du im Subselect den * durch eine Feldliste ersetzt, kannst du das äussere Query ganz weglassen.


Leider lässt MySQL bei den Views weder Subselects noch Paramters zu.
Darum sehe ich grad keine Variante das in eine View zu quetschen
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw
Danke sehr für deinen Input. Ich habe die gleiche Query betreffend COALESCE angepasst. Leider es ist eher langsamer geworden.
Welche aussere query meinst du, die weglassen kann? Vielleicht dann habe eine bessere Perfromance..
 
Das reicht doch:
SQL:
SELECT 
    t.b_id, 
    t.soll, 
    t.haben, 
    t.konto, 
    @n : = IF(@g <> konto, 0, @n) + COALESCE(soll, 0) - COALESCE(haben, 0) balance, 
    t.balance, 
    t.gkonto, 
    @g : = konto AS tmp_kto
FROM 
    view_bsatz t, 
    (SELECT @n : = 0, @g : = 0) vars
ORDER BY 
    konto, 
    b_id

Die Performance von COALESCE uind IFNULL habe ich noch nie getestet. Meine Idee mit IFNULL war rein aus dem Bauch heraus
 
Zuletzt bearbeitet von einem Moderator:
Was funktioniert nicht? Fehlermeldung?
Deine Aussage ist so nicht zu grabuchen.

Wenns nur die Spalte t.balance ist, die ich zuviel drin habe, sollte das in einer Fehlermeldung kommen.....
 
Ich nehme mir die Freiheit, es zu beantworten:

Fehlermeldung ist eindeutig und klar:

@n : = ... ist falsch, da bei dieser Art der Zuweisung KEIN Leerzeichen zwischen dem Doppelpunkt und dem Gleichheitszeichen sein darf!!
Gülitg wäre das hier: @n := ...

Rainer
 

Neue Beiträge

Zurück