Row Number Function wie bzw. an welcher Stelle im Query einsetzen

Hallo akretschmer

Irgendwie verstehe ich nur die Hälfte von dem was da steht.

Habe eigentlich gedacht, dass ich das so hinkriege ( versuchte Zeilen sind mit ------------- gekennzeichnet:)

Code:
SELECT
-- DENSE_RANK () OVER (
ROW_NUMBER  () OVER (
PARTITION BY RELFIRMA.FIRMANR
ORDER BY RELADRESSE.ADRESSENR,( CASE RELZTZB.Sprache  WHEN N'' || 'de' THEN 1  WHEN N'' || 'us' THEN 2 ELSE 9 END )
) AS rnk,
( CASE RELZTZB.Sprache WHEN N'' || 'de' THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END ) as case ,
WHERE rnk = '1'       ------------------------Entweder So

---ungeprüft---

RELFIRMA.FIRMANR as company,
RELADRESSE.ADRESSENR as ADRESSID,
RELZTSPE.Sprache as lang1,
RELZTZB.Sprache as lang2,
RELZTLB.Sprache as lang3
FROM (INFOR.RELFIRMA RELFIRMA
left outer join infor.reltext reltext on
relfirma.textnr = reltext.textnr
INNER JOIN INFOR.RELADRESSE RELADRESSE
ON (RELFIRMA.FIRMANR = RELADRESSE.FIRMANR)
inner JOIN INFOR.RELACP RELACP
ON (RELFIRMA.FIRMANR = RELACP.MNR)
inner join INFOR.RELANSCH RELANSCH
ON (RELADRESSE.ANSCHRIFTNR = RELANSCH.ANSCHRIFTNR))
left outer JOIN INFOR.RELZTLB RELZTLB
ON (RELACP.TEXT0 = RELZTLB.ZTKEY)
left outer JOIN INFOR.RELZTSPE RELZTSPE
ON (RELACP.TEXT1 = RELZTSPE.ZTKEY)
left outer JOIN INFOR.RELZTZB RELZTZB
ON (RELACP.ZBED = RELZTZB.ZTKEY)
WHERE RELFIRMA.VERWENDUNG1 = '1'
AND RELANSCH.VERWENDUNG1 = '1'
AND RELFIRMA.FIRMANR NOT LIKE 'I%'
--AND RELZTSPE.Sprache = 'de'
--AND RELZTZB.Sprache = 'de'
-- AND RELZTLB.Sprache = 'de'
AND rnk = '1'           ------------------------------------------oder  So.
ORDER BY company

Aber Beide Sachen klappen nicht
 
Werbung:
Du kannst nicht in derselben Abfrageebene auf eine via row_number() oder anders erstellte Spalte im Where zugreifen. Dazu müßtest Du das die Abfrage mit der row_number() als Subselect machen, in etwa so:

select * from (select-abfrage mit row_number() as rnk) foo where rnk = ...

Außerdem ist das Result von row_number() eine Zahl, kein String.
 
Hallo akretschmer

Danke für die Anhaltspunkte ( Ich muss aber ehrlich gestehen, dass ich mir sehr schwer tue wenn in der Syntax Fehler sind)

Hier habe ich mal meinen vorläufigen Query erstellt der auch mMn.
funktioniert:

Code:
select * from    ( SELECT
-- DENSE_RANK () OVER (
ROW_NUMBER  () OVER (
PARTITION BY RELFIRMA.FIRMANR
ORDER BY RELADRESSE.ADRESSENR,( CASE RELZTZB.Sprache  WHEN N'' || 'de' THEN 1  WHEN N'' || 'us' THEN 2 ELSE 9 END )
) AS rnk,
-- ( CASE RELZTZB.Sprache WHEN N'' || 'de' THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END ) as case ,


RELFIRMA.FIRMANR as company,
RELADRESSE.ADRESSENR as ADRESSID,
RELZTSPE.Sprache as lang1,
RELZTZB.Sprache as lang2,
RELZTLB.Sprache as lang3
FROM (INFOR.RELFIRMA RELFIRMA
left outer join infor.reltext reltext on
relfirma.textnr = reltext.textnr
INNER JOIN INFOR.RELADRESSE RELADRESSE
ON (RELFIRMA.FIRMANR = RELADRESSE.FIRMANR)
inner JOIN INFOR.RELACP RELACP
ON (RELFIRMA.FIRMANR = RELACP.MNR)
inner join INFOR.RELANSCH RELANSCH
ON (RELADRESSE.ANSCHRIFTNR = RELANSCH.ANSCHRIFTNR))
left outer JOIN INFOR.RELZTLB RELZTLB
ON (RELACP.TEXT0 = RELZTLB.ZTKEY)
left outer JOIN INFOR.RELZTSPE RELZTSPE
ON (RELACP.TEXT1 = RELZTSPE.ZTKEY)
left outer JOIN INFOR.RELZTZB RELZTZB
ON (RELACP.ZBED = RELZTZB.ZTKEY)
WHERE RELFIRMA.VERWENDUNG1 = '1'
AND RELANSCH.VERWENDUNG1 = '1'
AND RELFIRMA.FIRMANR NOT LIKE 'I%'
--AND RELZTSPE.Sprache = 'de'
--AND RELZTZB.Sprache = 'de'
-- AND RELZTLB.Sprache = 'de'
ORDER BY company )
where rnk = 1

Das CASE statement krieg ich irgendwie nicht unter das es dann noch läuft wo muss das dann den hin ?

Gibt es irgendwo eine gute Anlaufstelle für Anfänger wenn Syntax Fehler auftauchen ( expressions, parentheses etc.) mit Beispielen ?

grüße skyerjoe
 
Edit:

Mist ich war ein bißchen zu schnell, er zeigt mir jetzt nicht mehr die anderen Felder an vom Query nur noch die in dem
Row number select statement ( RNK ,company,adressid,lang1lang2,lang3. )

Code:
RNK    COMPANY    ADRESSID    LANG1    LANG2    LANG3
1    K00011    K00011-002        de   
1    K00012    K00012-002        de   
1    K00014    K00014-003        de   
1    K00015    K00015-002        de   
1    K00016    K00016-002        de   
1    K00017    K00017-002        de
 
Also keinen Plan was jetzt das Problem ist aber ich rate mal:
Code:
SELECT t.*
FROM (

SELECT
-- DENSE_RANK () OVER (
ROW_NUMBER () OVER (
PARTITION BY RELFIRMA.FIRMANR
ORDER BY RELADRESSE.ADRESSENR,( CASE RELZTZB.Sprache WHEN N'' || 'de' THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END )
) AS rnk,
( CASE RELZTZB.Sprache WHEN N'' || 'de' THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END ) as case,

---ungeprüft---
RELFIRMA.FIRMANR as company,
RELADRESSE.ADRESSENR as ADRESSID,
RELZTSPE.Sprache as lang1,
RELZTZB.Sprache as lang2,
RELZTLB.Sprache as lang3
FROM (INFOR.RELFIRMA RELFIRMA
left outer join infor.reltext reltext on
relfirma.textnr = reltext.textnr
INNER JOIN INFOR.RELADRESSE RELADRESSE
ON (RELFIRMA.FIRMANR = RELADRESSE.FIRMANR)
inner JOIN INFOR.RELACP RELACP
ON (RELFIRMA.FIRMANR = RELACP.MNR)
inner join INFOR.RELANSCH RELANSCH
ON (RELADRESSE.ANSCHRIFTNR = RELANSCH.ANSCHRIFTNR))
left outer JOIN INFOR.RELZTLB RELZTLB
ON (RELACP.TEXT0 = RELZTLB.ZTKEY)
left outer JOIN INFOR.RELZTSPE RELZTSPE
ON (RELACP.TEXT1 = RELZTSPE.ZTKEY)
left outer JOIN INFOR.RELZTZB RELZTZB
ON (RELACP.ZBED = RELZTZB.ZTKEY)
WHERE RELFIRMA.VERWENDUNG1 = '1'
AND RELANSCH.VERWENDUNG1 = '1'
AND RELFIRMA.FIRMANR NOT LIKE 'I%'
--AND RELZTSPE.Sprache = 'de'
--AND RELZTZB.Sprache = 'de'
-- AND RELZTLB.Sprache = 'de'
---ungeprüft Ende---

) t
WHERE t.rnk = 1
ORDER BY t.company
 
Hallo Ukulele

Mein Problem ist, das er in der Query Ausgabe die ganzen anderen Zeilen nicht mehr ausgibt.

Code:
---ungeprüft---
RELFIRMA.FIRMANR as company,
RELADRESSE.ADRESSENR as ADRESSID,
RELZTSPE.Sprache as lang1,
RELZTZB.Sprache as lang2,
RELZTLB.Sprache as lang3
FROM (INFOR.RELFIRMA RELFIRMA
left outer join infor.reltext reltext on
relfirma.textnr = reltext.textnr
INNER JOIN INFOR.RELADRESSE RELADRESSE
ON (RELFIRMA.FIRMANR = RELADRESSE.FIRMANR)
inner JOIN INFOR.RELACP RELACP
ON (RELFIRMA.FIRMANR = RELACP.MNR)
inner join INFOR.RELANSCH RELANSCH
ON (RELADRESSE.ANSCHRIFTNR = RELANSCH.ANSCHRIFTNR))
left outer JOIN INFOR.RELZTLB RELZTLB
ON (RELACP.TEXT0 = RELZTLB.ZTKEY)
left outer JOIN INFOR.RELZTSPE RELZTSPE
ON (RELACP.TEXT1 = RELZTSPE.ZTKEY)
left outer JOIN INFOR.RELZTZB RELZTZB
ON (RELACP.ZBED = RELZTZB.ZTKEY)
WHERE RELFIRMA.VERWENDUNG1 = '1'
AND RELANSCH.VERWENDUNG1 = '1'
AND RELFIRMA.FIRMANR NOT LIKE 'I%'
--AND RELZTSPE.Sprache = 'de'
--AND RELZTZB.Sprache = 'de'
-- AND RELZTLB.Sprache = 'de'
---ungeprüft Ende---

grüße skyerjoe
 
Mit SELECT t.* FROM ( ... ) t müssen alle Spalten aus dem Subquery auch in der Ausgabe stehen, also:
rnk,
case,
company,
ADRESSID,
lang1,
lang2,
lang3

"case" ist vielleicht ein schlechter Spaltenname weil auch ein Schlüsselwort. Ansonsten passt die Ausgabe nicht zum gezeigten Code.
 
Dann ersetze das SELECT t.* durch
Code:
SELECT t.rnk,t.[case],t.company,t.ADRESSID,t.lang1,t.lang2,t.lang3
FROM (

SELECT
-- DENSE_RANK () OVER (
ROW_NUMBER () OVER (
PARTITION BY RELFIRMA.FIRMANR
ORDER BY RELADRESSE.ADRESSENR,( CASE RELZTZB.Sprache WHEN N'' || 'de' THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END )
) AS rnk,
( CASE RELZTZB.Sprache WHEN N'' || 'de' THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END ) as case,

---ungeprüft---
RELFIRMA.FIRMANR as company,
RELADRESSE.ADRESSENR as ADRESSID,
RELZTSPE.Sprache as lang1,
RELZTZB.Sprache as lang2,
RELZTLB.Sprache as lang3
FROM (INFOR.RELFIRMA RELFIRMA
left outer join infor.reltext reltext on
relfirma.textnr = reltext.textnr
INNER JOIN INFOR.RELADRESSE RELADRESSE
ON (RELFIRMA.FIRMANR = RELADRESSE.FIRMANR)
inner JOIN INFOR.RELACP RELACP
ON (RELFIRMA.FIRMANR = RELACP.MNR)
inner join INFOR.RELANSCH RELANSCH
ON (RELADRESSE.ANSCHRIFTNR = RELANSCH.ANSCHRIFTNR))
left outer JOIN INFOR.RELZTLB RELZTLB
ON (RELACP.TEXT0 = RELZTLB.ZTKEY)
left outer JOIN INFOR.RELZTSPE RELZTSPE
ON (RELACP.TEXT1 = RELZTSPE.ZTKEY)
left outer JOIN INFOR.RELZTZB RELZTZB
ON (RELACP.ZBED = RELZTZB.ZTKEY)
WHERE RELFIRMA.VERWENDUNG1 = '1'
AND RELANSCH.VERWENDUNG1 = '1'
AND RELFIRMA.FIRMANR NOT LIKE 'I%'
--AND RELZTSPE.Sprache = 'de'
--AND RELZTZB.Sprache = 'de'
-- AND RELZTLB.Sprache = 'de'
---ungeprüft Ende---

) t
WHERE t.rnk = 1
ORDER BY t.company
Spaltennamen würde ich sowieso in fertigen Querys immer explizit ausschreiben. Ich kann aber absolut nicht nachvollziehen wie bei einem SELECT t.* Spalten aus der Tabelle, die in diesem Fall ein Subquery ist, nicht aufgeführt werden. Das kann nur was mit Oracle zu tun haben.
 
Hallo Ukulele

Alles klar dann schau ich mal ob ich irgendwelche Ungereimtheiten finde und ich probiere es nochmal bei einem Kollegen.

Danke für die Hilfe

grüße skyerjoe
 
Hallo Nochmal

Mein Query läuft soweit ganz gut jetzt.

Aber ein was fehlt mir noch bzw. würde die Abfrage nahezu Perfekt machen.

Manche Firmen haben keine Firma.Verwendung mit dem Wer 1, was bei uns die Standard Adresse ist.
Siehe :
Code:
AND RELANSCH.VERWENDUNG1 = '1'

Wie könnte ich einen Fallback einbauen, wenn der Wert 1 nicht vorhanden ist , dann nehme einen der vorhanden ist. Diesen Wert weiss ich auch sonst denke ich müßte ich ein Array bauen und immer alle Werte des Feldes abfragen ( so meine nicht verifizierte Denkweise).

grüße skyerjoe
 
Zuletzt bearbeitet:
Wie würde ich eigentlich vorgehen, wenn ich den case erweitern will wie zB. in der Art:


Code:
CASE RELZTZB.Sprache WHEN N'' || 'de' and RELZTZl.Sprache N'' || 'de'    THEN 1 WHEN N'' || 'us' THEN 2 ELSE 9 END
AS rnk,

Also sozusagen eine 2te Bedienung zur ersten Kondition hinzuzufügen.
 
Gibt es irgendwo eine gute Seite, das die Zusammenhänge einfach erklärt und wo ich verstehen kann wo ich zB. eine weitere rnk abfrage setzten müsste.

grüße skyerjoe
 
Werbung:
Also ich denke wir machen das mit COALSCE alles andere zielt eigentlich auf eine andere Abfrage ab......

Kann ich diese auch in die Where clause verpacken?


in etwa so:

Code:
where RELFIRMA.FIRMANR not like 'I%'
and infor.relfirma.firmanr not like '70%'
and infor.relansch.verwendung1 COALESCE ( 1, 175,)
 
Zurück
Oben