[SQL] if not exist

Pagina: 1
Acties:

  • drice
  • Registratie: December 2000
  • Laatst online: 13:08

drice

Loading...

Topicstarter
Ik heb hier even problemen met een sql query.

Ik heb 4tal tabellen die aan elkaar gejoined moet worden.
Ik kijk in de uitkeringen tabel of er uitkeringen tabel. Zoja dan zoek ik daar de verzekering ,relatie en polis gegevens bij.

In de tabel verzekering kan een begunstigde staan, maar als die niet is ingevuld zoek in polis tabel naar de eerste verzekeringsnemer


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
select 
*

from uitkering, uitkeringschema, relatie , verzekering, relatie_fiscaal, fin_sturing, produkt
where uitkering.nr_polis = uitkeringschema.nr_polis(+)
and uitkering.NR_VERSIE = uitkeringschema.NR_VERSIE
and uitkering.NR_VERZEK = uitkeringschema.NR_VERZEK

and produkt.CD_PROD = verzekering.CD_PROD

and verzekering.NR_POLIS = uitkering.NR_POLIS
and verzekering.NR_VERSIE = uitkering.NR_VERSIE
and verzekering.NR_VERZEK = uitkering.NR_VERZEK

and polis.NR_POLIS = uitkering.NR_POLIS

--and verzekering.RN_UITKERING = relatie.NR_RELATIE or polis.RN_VERZEKNEMER = relatie.NR_RELATIE


and relatie.NR_RELATIE = fin_sturing.NR_RELATIE 
and relatie.NR_RELATIE = relatie_fiscaal.NR_RELATIE 

and uitkering.RD_VERWERKT between to_date('04-01-2005', 'DD-MM-YYYY')  and to_date('04-01-2005', 'DD-MM-YYYY')  +1

and fin_sturing.NR_REKENING = (SELECT min(fin_sturing.NR_REKENING) 
                              FROM fin_sturing 
                              WHERE fin_sturing.NR_RELATIE = uitkering.NR_RELATIE
                              and (fin_sturing.CD_UNIPAS = 'B' OR fin_sturing.CD_UNIPAS = 'E'))


Deze query klopt niet helemaal want ik wil graag

code:
1
2
3
4
5
if exists(       select v.RN_UITKERING 
                 from verzekering v, uitkering u
                 where v.NR_POLIS =  u.NR_POLIS
                 and v.NR_VERSIE = u.NR_VERSIE
                 and v.NR_VERZEK = u.NR_VERZEK

bij hebben

Did you know that IF is a middle word in life. "Ja maar wie ben ik om aan mezelf te twijfelen"


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik kijk in de uitkeringen tabel of er uitkeringen tabel. Zoja dan zoek ik daar de verzekering ,relatie en polis gegevens bij.
Kun je een INNER JOIN gebruiken? Dan toont hij automatisch alleen resultaten als er overeenkomstige gegevens zijn tussen de tabellen.
In de tabel verzekering kan een begunstigde staan, maar als die niet is ingevuld zoek in polis tabel naar de eerste verzekeringsnemer
Kun je iets met de ISNULL functie (beetje afhankelijk van je DMBS voor de exacte functie).

Voor de rest is het een beetje lastig zonder een duidelijke omschrijving van de tabellen en gewenste output.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • drice
  • Registratie: December 2000
  • Laatst online: 13:08

drice

Loading...

Topicstarter
kun je met een inner join ook testen

code:
1
2
3
4
if (verzekering.rn_uitkering != null)
// gebruik dit relatie nummer
else
// gebruik polis eerste verzekeringsnemer

Did you know that IF is a middle word in life. "Ja maar wie ben ik om aan mezelf te twijfelen"


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Ik denk dat je wel een ISNULL in de join criteria kunt gebruiken

INNER JOIN tabel ON foo = ISNULL(verzekering.rn_uitkering , polisnummer)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Welke database server gebruik je?
Ik heb voor het gemak je query wat herschreven naar iets wat in mijn ogen overzichtelijker is en die volgens mij hetzelfde doet wat jij wilt in je eerste query. Ik geloof dat de LIMIT clause niet werkt in mssql databases.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
SELECT
*
FROM
    uitkering 
        INNER JOIN uitkeringschema ON
            uitkering.nr_polis = uitkeringschema.nr_polis AND
            uitkering.NR_VERSIE = uitkeringschema.NR_VERSIE AND
            uitkering.NR_VERZEK = uitkeringschema.NR_VERZEK AND
        INNER JOIN produkt ON
            produkt.CD_PROD = verzekering.CD_PROD
        INNER JOIN verzekering ON
            verzekering.NR_POLIS = uitkering.NR_POLIS AND
            verzekering.NR_VERSIE = uitkering.NR_VERSIE AND
            verzekering.NR_VERZEK = uitkering.NR_VERZEK
        INNER JOIN polis ON
            polis.NR_POLIS = uitkering.NR_POLIS
        INNER JOIN fin_sturing ON
            fin_sturing.NR_RELATIE = uitkering.NR_RELATIE
        INNER JOIN relatie ON
            relatie.NR_RELATIE = fin_sturing.NR_RELATIE
        INNER JOIN relatie_fiscaal ON
            relatie_fiscaal.NR_RELATIE = relatie.NR_RELATIE
            
WHERE
    (uitkering.RD_VERWERKT BETWEEN to_date('04-01-2005', 'DD-MM-YYYY')  AND to_date('04-01-2005', 'DD-MM-YYYY')  + 1) AND
    (fin_sturing.CD_UNIPAS = 'B' OR fin_sturing.CD_UNIPAS = 'E')
ORDER BY 
    fin_sturing.NR_REKENING ASC
LIMIT (0,1)


Nou kan je dmv een 'LEFT JOIN' een tabel toevoegen die ook NULL mag zijn (dus die wordt alleen meegenomen als er overeenkomstige records bestaan). Je kan dan in je velden specificatie een CASE of IIF expressie gebruiken.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:31

Creepy

Tactical Espionage Splatterer

drice schreef op vrijdag 07 januari 2005 @ 15:41:
Deze query klopt niet helemaal want ik wil graag
We willen allemaal wel iets heel graag ;)

Wat heb je nu zelf al geprobeerd? Wat ging daar mee mis? Kreeg je een foutmelding? Zo ja, welke?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Als je MS-SQL gebruikt, dan is het COALESCE statement misschien wel bruikbaar voor je.
(zie Transact-SQL Reference)

  • drice
  • Registratie: December 2000
  • Laatst online: 13:08

drice

Loading...

Topicstarter
Ik zit op een oracle 9i database

Ik heb in mijn select query nu
code:
1
2
case when verzekering.RN_UITKERING is not null then verzekering.RN_UITKERING
  else polis.RN_VERZEKNEMER end  as biD


Op dit moment krijg ik wel het goede relatie nummer.
Dus op select niveau kan het wel
Alleen als ik die case op join niveau probeer

code:
1
2
3
4
        CASE WHEN verzekering.RN_UITKERING is not null 
             then fin_sturing.NR_RELATIE = verzekering.RN_UITKERING
             else fin_sturing.NR_RELATIE = polis.RN_VERZEKNEMER 
        END

Dan krijg ik missing keyword

Did you know that IF is a middle word in life. "Ja maar wie ben ik om aan mezelf te twijfelen"


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Dit kun je waarschijnlijk op meerdere manieren oplossen.
Wat zeker werkt is 2 variaties van je query maken, 1 voor de niet ingevulde begunstigde en 1 voor de wel ingevulde begunstigde. Deze kun je dan samenvoegen middels een 'union all'.

Mogelijk kun je ook een query in je select list gebruiken. Deze komt dan misschien binnen je case (of decode). Ik weet niet zeker of 9i dat slikt.

Who is John Galt?


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 08:31

Creepy

Tactical Espionage Splatterer

Op welke plek precies krijg je missing keyword? Kan een case wel op een andere plek staan dan in de where?

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Creepy schreef op vrijdag 07 januari 2005 @ 17:50:
Op welke plek precies krijg je missing keyword? Kan een case wel op een andere plek staan dan in de where?
Een case kan alleen in de select list, niet in de where.

Who is John Galt?


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 13:39

The Eagle

I wear my sunglasses at night

Binnen Oracle is het zeker aan te raden met aliassen te werken, bijv:
code:
1
select * from uitkering A, verzekering B


Daarnaast dien je in je subselect zeker een alias te gebruiken als je een subselect op de zelfde tabel maakt:
code:
1
2
3
select * from uitkering A
where
(select ID from uitkering A1 where datum = '01-01-90' )


Bovendien bevordert het gebruik van aliasen in je SQL-code de leesbaarheid een heel stuk :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • drice
  • Registratie: December 2000
  • Laatst online: 13:08

drice

Loading...

Topicstarter
Ik werk normaal gesproken ook met alliasen maar dit was even een kladje

Ik heb het ondertussen al opgelost met een subselect

code:
1
fin_sturing.NR_RELATIE = (SELECT CASE WHEN verzekering.RN_UITKERING .....

Did you know that IF is a middle word in life. "Ja maar wie ben ik om aan mezelf te twijfelen"

Pagina: 1