Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/05/2011, 15h49   #1
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
Par défaut champ null dans une requête update

bonjour,

je cherche à updater une table (tab1) en prenant des valeurs dans la table tab2.
Code :
1
2
3
4
5
6
7
8
9
 
UPDATE tab1 A 
  SET (A.COUNTRY, A.ADDRESS1) = ( 
 SELECT COUNTRY 
 , ADDRESS1 
   FROM tab2 B 
 WHERE AND B.ORDER_NO =A.ORDER_NO
   AND B.SRC='xx' 
   )
le problème c'est quand l'un des champs (ou tout les deux) COUNTRY et ADDRESS1 sont null dans la table tab2 je ne peux pas updater la table 1 (champs non nullable dans tab1).
Code :
1
2
 
01407. 00000 -  "cannot update (%s) to NULL"
comment modifier cette requête pour enpêcher l'update en cas de champs nulls.

merci d'avance
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 16h30   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
en ajoutant une clause where

Code :
1
2
3
4
5
6
7
8
UPDATE tab1 A 
  SET (A.COUNTRY, A.ADDRESS1) = ( 
 SELECT COUNTRY  , ADDRESS1    FROM tab2 B  WHERE B.ORDER_NO=A.ORDER_NO  AND B.SRC='xx') 
WHERE EXISTS (
 SELECT *  FROM tab2 C
 WHERE C.ORDER_NO =A.ORDER_NO  AND C.SRC='xx' 
  AND C.COUNTRY IS NOT NULL  AND C.ADDRESS1 IS NOT NULL 
   )
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/05/2011, 16h50   #3
Membre régulier
 
Avatar de hammag
 
Inscription : février 2006
Messages : 477
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 477
Points : 94
Points : 94
malheureusement j'ai toujours le même problème.
hammag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/05/2011, 17h39   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 925
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

Informations professionnelles :
Activité : Administrateur de base de données
Secteur : Finance

Informations forums :
Inscription : décembre 2005
Messages : 2 925
Points : 4 547
Points : 4 547
donne nous un test-case, chez moi ça marche...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE tab1(
   order_no   NUMBER PRIMARY KEY,
   country    VARCHAR2 (2) NOT NULL,
   address1    VARCHAR2 (20) NOT NULL
);
INSERT INTO tab1  VALUES (1, 'CH', 'rue de la Blonde');
INSERT INTO tab1 VALUES (2, 'CM', 'rue de la Joie');
CREATE TABLE tab2(
   order_no   NUMBER PRIMARY KEY,
   country    VARCHAR2 (2),
   address1    VARCHAR2 (20),
   src        VARCHAR2 (2)
);
INSERT INTO tab2  VALUES (1, 'CH', 'rue de la Brunette', 'xx');
INSERT INTO tab2 VALUES (2, 'CM', NULL, 'xx');
Code :
1
2
3
4
5
6
7
8
9
SQL> UPDATE tab1 A
  2     SET (A.COUNTRY, A.ADDRESS1) =
  3            (SELECT COUNTRY, ADDRESS1
  4               FROM tab2 B
  5              WHERE B.ORDER_NO = A.ORDER_NO AND B.SRC = 'xx');
   SET (A.COUNTRY, A.ADDRESS1) =
                   *
ERROR at line 2:
ORA-01407: cannot UPDATE ("SCOTT"."TAB1"."ADDRESS1") TO NULL
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SQL> UPDATE tab1 A
  2     SET (A.COUNTRY, A.ADDRESS1) =
  3            (SELECT COUNTRY, ADDRESS1
  4               FROM tab2 B
  5              WHERE B.ORDER_NO = A.ORDER_NO AND B.SRC = 'xx')
  6   WHERE EXISTS
  7            (SELECT *
  8               FROM tab2 C
  9              WHERE     C.ORDER_NO = A.ORDER_NO
 10                    AND C.SRC = 'xx'
 11                    AND C.COUNTRY IS NOT NULL
 12                    AND C.ADDRESS1 IS NOT NULL);
 
1 row updated.
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/05/2011, 19h17   #5
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 442
Points : 10 442
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Un peu plus court à partir de la 10g :
Code :
1
2
3
4
5
6
7
8
9
MERGE INTO tab1 A 
USING tab2 B
   ON (B.ORDER_NO = A.ORDER_NO
  AND  B.SRC      = 'xx'
  AND  B.COUNTRY  IS NOT NULL
  AND  B.ADDRESS1 IS NOT NULL)
 WHEN MATCHED THEN UPDATE
  SET A.COUNTRY  = B.COUNTRY
    , A.ADDRESS1 = B.ADDRESS1;
__________________
Email : http://scr.im/waldar
Waldar est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h08.


 
 
 
 
Partenaires

Hébergement Web