webForumDet fria alternativet

Få bort dubletter

4 svar · 468 visningar · startad av SteveP

StevePMedlem sedan mars 2003772 inlägg
#1

Nedre kod returnerar kontakter med
Mail Address, Private Address och Visit Address
Vissa personer kan dyka upp tre gånger efter queryn har körts eftersom samma person kan ha 3 olika addresstyper.

vad jag då vill göra är att:

Om en contact har "Mail Address" så ska den enbart returnera den raden för personen, finns det ej någon "Mail Address" så ska den kolla ifall personen har en "Private Address" och isf så ska den returneras, om varken "Mail Address" eller "Private Address" finns så skall till sist retuerna raden med "Visit Address" för personen. En person har alltid en eller flera av dessa tre adresser.

För att tydliggöra vad jag är ute efter så när jag kör min query nedanför så kan jag få följande resultat tillbaka:
ROW_ID-------NAME-----------ADDRESS------------ADDR_TYPE_CD
1-GGHT-------Anders Borg, --- stridgatan 3, -------- Mail Address
1-GGHT-------Anders Borg, --- västgatan 15,------- Private Address
1-GGHT-------Anders Borg, --- Kustvägen 5, ------- Visit Address

Men vad jag vill få tillbaka i detta fallet är enbart:
ROW_ID-------NAME-----------ADDRESS------------ADDR_TYPE_CD
1-GGHT-------Anders Borg, --- stridgatan 3, ------- Mail Address

Den skall alltså exkludera dom andra två raderna eftersom det finns en Mail Address och den har högst prioritering.

prioriteringsordningen är alltså:
1. Mailing Address
2. Private Address
3. Visit Address

Select

S_CONTACT.LAST_NAME, 
S_CONTACT.FST_NAME,
S_CONTACT.ROW_ID, 
S_CONTACT.X_PR_CON_ADDR_ID, 
S_CONTACT.X_PR_CON_SPEC_ID, 
S_CONTACT.PR_TERR_ID, 
S_CONTACT.PR_POSTN_ID, 
S_CONTACT.PR_AFFL_ID, 
S_CONTACT.PERSON_UID, 
S_CONTACT.BU_ID, 
S_CONTACT.PAR_ROW_ID,
S_CON_ADDR.ADDR_TYPE_CD,
S_CON_ADDR.ACTIVE_FLG

from S_CONTACT 

Inner JOIN S_CON_ADDR ON S_CON_ADDR.CONTACT_ID = S_CONTACT.ROW_ID

where 
S_CON_ADDR.ADDR_TYPE_CD = 'Mailing Address' OR 
S_CON_ADDR.ADDR_TYPE_CD = 'Private Address' OR 
S_CON_ADDR.ADDR_TYPE_CD = 'Visit Address'
LarsGMedlem sedan dec. 200012 464 inlägg
#2

Skapa en tabell med två kolumner, en med addresstype och en prioritetskolumn. Sen så är det bara att joina ihop och välja den med högst prioritet.

StevePMedlem sedan mars 2003772 inlägg
#3

LarsG skrev:

Skapa en tabell med två kolumner, en med addresstype och en prioritetskolumn. Sen så är det bara att joina ihop och välja den med högst prioritet.

Jag kan tyvärr inte skapa tabeller själv då detta kommer gå på produktionsdatabasen för affärssystemet som ligger utomlands. Jag har enbart read-only rättigheter.

Går det inte att göra på den befintliga strukturen så som du ser hur min select ser ut nu ?

LarsGMedlem sedan dec. 200012 464 inlägg
#4

har för mig att du använder SQL server, om inte säg till

S_CONTACT.LAST_NAME, 
S_CONTACT.FST_NAME,
S_CONTACT.ROW_ID, 
S_CONTACT.X_PR_CON_ADDR_ID, 
S_CONTACT.X_PR_CON_SPEC_ID, 
S_CONTACT.PR_TERR_ID, 
S_CONTACT.PR_POSTN_ID, 
S_CONTACT.PR_AFFL_ID, 
S_CONTACT.PERSON_UID, 
S_CONTACT.BU_ID, 
S_CONTACT.PAR_ROW_ID,
S_CON_ADDR.ADDR_TYPE_CD,
S_CON_ADDR.ACTIVE_FLG

from S_CONTACT 
Inner JOIN S_CON_ADDR ON S_CON_ADDR.CONTACT_ID = S_CONTACT.ROW_ID
join (select 'Mailing Address' as addr_type_cd,1 as prio
       union all
      select 'Private Address' ,2
       union all
      select 'Visit Address',3) dt
 on s_CON_ADDR.ADDR_TYPE_CD = dt.addr_type_cd
where prio in 
 (select min(prio)
    from S_CON_ADDR as sca 
    join (select 'Mailing Address' as addr_type_cd,1 as prio
       union all
      select 'Private Address' ,2
       union all
      select 'Visit Address',3) dt on sca.addr_type_cd = dt.addr_type_cd
   where sca.contact_id = s_contact.row_id)
StevePMedlem sedan mars 2003772 inlägg
#5

Tusen tack LarsG!

133 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)