Anmelden

View Full Version : SQL Problem



Seiten : 1 2 [3] 4 5

Pikachu
15-06-10, 13:43
Dann nimm doch MIN(...) wie weiter oben genannt.

bettina_martin
15-06-10, 13:47
Dann nimm doch MIN(...) wie weiter oben genannt.

naja, das wär ne möglichkeit, ABER:

ich will das MIN bezogen auf das Feld CONSNUMBER. Will aber das Feld tel_number ausgeben.

wie soll ich das machen. euer vorgeschlagenes select bezieht sich ja auf die tel_number.

Pikachu
15-06-10, 13:53
Paßt doch. Du brauchst natürlich ein MIN() in jedem Sub-SELECT. Wenn zum Beispiel im ersten Sub-SELECT zwei oder mehr Telefonnummern gefunden werden, treffen ja alle zu und du willst dann irgendeine von diesen. Dann nimm doch einfach die kleinste. Die erhältst du dann mit MIN() in diesem Sub-SELECT.

B.Hauser
15-06-10, 13:55
Warum versuchst Du nicht das SQL-Statements umzuschreiben und joins zu verwenden, wie ich es bereits vorhin vorgeschlagen habe.

Falls ich heute Abend Zeit habe werde ich das Statement umschreiben.

Birgitta

bettina_martin
15-06-10, 13:57
Paßt doch. Du brauchst natürlich ein MIN() in jedem Sub-SELECT. Wenn zum Beispiel im ersten Sub-SELECT zwei oder mehr Telefonnummern gefunden werden, treffen ja alle zu und du willst dann irgendeine von diesen. Dann nimm doch einfach die kleinste. Die erhältst du dann mit MIN() in diesem Sub-SELECT.

sorry, dann hab ich mich falsch ausgedrückt bzw. ist der source-code vom sql veraltet:

ich will aus der datei ADR2 die tel_number mit der KLEINSTEN consnumber, wo noch andere abfragen im WHERE drinnen sind.

sorry, war wie gesagt ne alte source.

bettina_martin
15-06-10, 13:58
Warum versuchst Du nicht das SQL-Statements umzuschreiben und joins zu verwenden, wie ich es bereits vorhin vorgeschlagen habe.

Falls ich heute Abend Zeit habe werde ich das Statement umschreiben.

Birgitta

weil ich SAP-Mensch bin und nicht unbedingt der große SQL-Guru ;-)))

Pikachu
15-06-10, 14:09
Wie ist denn die aktuelle Quelle?

bettina_martin
15-06-10, 14:12
Wie ist denn die aktuelle Quelle?



CREATE VIEW ZKNA2_VIEW AS ( SELECT A.MANDT, A.KUNNR, A.NAME1, A.NAME
2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, VALUE(TEL1, '') AS T
EL1, VALUE(TEL2, '') AS TEL2, VALUE(MOBIL1, '') AS MOBIL1, VALUE(MOB
IL2, '') AS MOBIL2, VALUE(EMAIL1,'') AS EMAIL1, VALUE(EMAIL2,'') AS
EMAIL2, A.STCEG FROM ( SELECT A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.
STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, (SELECT TEL_NUMBER FROM R
3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1' ) AS TEL1,
(SELECT TEL_NUMBER FROM R3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND
R3_USER = ' ' ) AS TEL2, (SELECT TEL_NUMBER FROM R3P02DATA.ADR2 WHER
E ADDRNUMBER=A.ADRNR AND R3_USER = '3' ) AS MOBIL1, (SELECT TEL_NUMB
ER FROM R3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '2' )
AS MOBIL2, (SELECT SMTP_ADDR FROM R3P02DATA.ADR6 WHERE ADDRNUMBER=A.
ADRNR AND FLGDEFAULT = 'X' ) AS EMAIL1, (SELECT SMTP_ADDR FROM R3P02
DATA.ADR6 WHERE ADDRNUMBER=A.ADRNR AND FLGDEFAULT = ' ' ) AS EMAIL2,
A.STCEG FROM R3P02DATA.KNA1 A ) AS A WHERE A.KUNNR < '0000999999' A
ND A.MANDT = '101' AND A.KUNNR <> '0000062871' )


sry, hab die quelle nur mehr in dieser unstrukturierten form :)

die subselects bringen hin und wieder mehr als einen satz (aber selten). das möchte ich verhindern indem ich in den jeweiligen abfragen das MIN von der CONSNUMBER nehme.

Pikachu
16-06-10, 11:30
Das erste Sub-SELECT könnte dann vielleicht so aussehen:

SELECT MIN(TEL_NUMBER) FROM R3P02DATA.ADR2
WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1' AND CONSNUMBER =
(
SELECT MIN(CONSNUMBER) FROM R3P02DATA.ADR2
WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1'
)

bettina_martin
17-06-10, 08:15
so, ich habe das ganze jetzt geschafft, funktioniert sehr gut, NUR: die Performance ist absolut mies. Mein Programmierer, der auf diesen View zugreift killt mich fast dafür.

Wie kann ich das performancemässig verbessern ?

anbei der code



CREATE VIEW cmsms1/zkna3_view AS (
select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01,
A.PSTLZ, A.LAND1, A.SORTL, VALUE(TEL1, '') AS TEL1,
VALUE(TEL2, '') AS TEL2, VALUE(MOBIL1, '') AS MOBIL1,
VALUE(MOBIL2, '') AS MOBIL2, VALUE(EMAIL1, '') AS EMAIL1,
VALUE(EMAIL2, '') AS EMAIL2, A.STCEG FROM
(SELECT A.MANDT, A.kunnr, A.NAME1, A.NAME2, STRAS, A.ORT01, A.PSTLZ,
A.LAND1, A.SORTL, A.BEGRU,

(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and (r3_user = '1' or (r3_user = ' ' and flgdefault = 'X'))
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr
and (r3_user = '1' or (r3_user = ' ' and flgdefault = 'X'))))
as tel1,

(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and r3_user = ' ' and flgdefault = ' '
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr and r3_user = ' '
and flgdefault = ' ')) as tel2,

(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and (r3_user = '3' or (r3_user = '2' and flgdefault = 'X'))
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr
and (r3_user = '3' or (r3_user = '2' and flgdefault = 'X'))))
as mobil1,

(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and r3_user = '2' and flgdefault = ' '
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr
and r3_user = '2' and flgdefault = ' '))
as mobil2,

(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr
and flgdefault = 'X' and consnumber = (select min(consnumber)
from r3p02data/adr6 where addrnumber=A.adrnr and flgdefault = 'X'))
as email1,

(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr
and flgdefault = ' ' and consnumber = (select min(consnumber)
from r3p02data/adr6 where addrnumber=A.adrnr and flgdefault = ' '))
as email2,

A.STCEG FROM R3P02DATA/KNA1 A ) AS A WHERE A.KUNNR < '0000999999'
AND A.MANDT = '101' AND A.BEGRU <> 'LOES')