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 31/12/2007, 09h03   #1
Invité régulier
 
Inscription : décembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 12
Points : 5
Points : 5
Par défaut requete qui marche mais que jaimerai beaucoup simplifier :-(

J'ai deux tables:
- announcements
. announcement_id
. date_begin
. date_exp
. sujet

- announcement_user
. announcement_id
. user_id
. is_deleted

Qd le user se connecte, il accede directement a la page d'annonces avec la liste des annonces actives qu'il n'a pas efface lui meme. Et c'est unique;ent quand il se connecte a la page d'annonce qu'on ajoute les lignes dans la table annonce_user.
En gros, ca veut dire que y a pas de ligne dans la table user s'il n'est pas entre dans le site encore. C'est ce qui me complique la vie.
Bref, je veux sortir la liste des annonces actives qu'il n'a pas efface. et J'y arrive pas.

J'ai cette requete qui marche pour le moment (le 735, je l'ai impose en dur, parce que j'aurai l'id du user a partir du site, donc on peut laisser je pense).

select id, sub, is_deleted, user_id
from (select ANN.announcement_id id, ANN.subject sub, ANN.body, nvl(TAB.is_deleted, 0) is_deleted, 735 as user_id
from (select announcement_id, 735 as user_id, is_deleted
from announcement_user
where user_id = 735
) TAB, announcements ANN
where ANN.announcement_id = TAB.announcement_id (+)
and date_begin <= sysdate
and sysdate <= date_exp) POURVOIR
where is_deleted = 0


mais je crois que je me complique la vie... y a moyen de simplifier????
lety247 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2008, 17h43   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Si j'ai bien compris la situation alors voici deux possibilités où :user_id est l'identifiant fourni par l'application (735 dans votre exemple)

Code :
1
2
3
4
5
6
7
 
SELECT ...
FROM announcements a, announcement_user u
WHERE a.announcement_id = u.announcement_id (+)
  AND 0 = u.is_deleted (+)
  AND :user_id = u.user_id (+)
  AND sysdate BETWEEN a.date_begin AND a.date_exp
ou
Code :
1
2
3
4
5
6
7
8
9
 
SELECT ...
FROM announcements a LEFT JOIN announcement_user u
ON    a.announcement_id = u.announcement_id
      AND
      0 = u.is_deleted
      AND
      :user_id = u.user_id
WHERE sysdate BETWEEN a.date_begin AND a.date_exp
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 11h43   #3
Invité régulier
 
Inscription : décembre 2007
Messages : 12
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 12
Points : 5
Points : 5
Par défaut ca marche!!!

Effectivement, j'ai pu utiliser votre requete,

Code :
1
2
3
4
5
6
SELECT ...
FROM announcements a, announcement_user u
WHERE a.announcement_id = u.announcement_id (+)
  AND 0 = u.is_deleted (+)
  AND :user_id = u.user_id (+)
  AND sysdate BETWEEN a.date_begin AND a.date_exp
Je savais pas qu'on pouvait mettre les (+) sur tous les champs, c'est ce qui a bloque mon raisonnement....

Un GRAND GRAND MERCI :-)
lety247 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 11h46   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Vaut mieux utiliser l'écriture ANSI maintenant qu'Oracle le supporte parce que tous les SGBD tendent vers cette norme
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 11h46   #5
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Citation:
Je savais pas qu'on pouvait mettre les (+) sur tous les champs, c'est ce qui a bloque mon raisonnement.
Non seulement on peut, mais ON DOIT le faire , sinon les résultats de la jointure externe sont pour le moins erratiques !
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h18   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
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 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par orafrance Voir le message
Vaut mieux utiliser l'écriture ANSI maintenant qu'Oracle le supporte parce que tous les SGBD tendent vers cette norme
à la rigueur, mais l'écriture ANSI a beaucoup plus de bugs, même en 10gR2. Elle est également à éviter par exemple si l'on crée une vue matérialisée de type Fast-Refreshable.
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 15h32   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Je ne savais pas Toujours est-il qu'il faut commencer à sérieusement la maitriser (ce qui n'est pas mon cas ) parce qu'il semble qu'Oracle finisse par l'imposer
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h10   #8
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
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 927
Points : 4 549
Points : 4 549
en tout cas aucune vue interne ne l'employe

Code :
1
2
3
4
5
6
7
8
SELECT text FROM  dba_views WHERE view_name='ALL_TABLES' ;
SELECT 
 ...
FROM
 ...
WHERE
  t.bobj# = co.obj# (+) 
...
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 16h17   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Il se dit que la 12 n'acceptera plus le (+) mais j'suis pas sûr que ce soit officiel
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 18h35   #10
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par laurentschneider Voir le message
en tout cas aucune vue interne ne l'employe

Code :
1
2
3
4
5
6
7
8
SELECT text FROM  dba_views WHERE view_name='ALL_TABLES' ;
SELECT 
 ...
FROM
 ...
WHERE
  t.bobj# = co.obj# (+) 
...
Il y a aussi des vues qui utilisent le hint /*+ RULE */ dans 10gR2 ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 08h59   #11
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
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 927
Points : 4 549
Points : 4 549
Citation:
Envoyé par Michel SALAIS Voir le message
Il y a aussi des vues qui utilisent le hint /*+ RULE */ dans 10gR2 ...
Bien entendu !
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2008, 12h19   #12
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
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 927
Points : 4 549
Points : 4 549
Il y a une grande différence cependant entre /*+RULE*/ et (+)

Si le RBO est supprimé dans une prochaîne version, alors /*+RULE*/ sera sans effet. En aucun cas le résultat de la requête ne peut changer (sinon c'est un bug de prio 1).

Si le (+) était supprimé, alors toutes les requêtes qui employent (+) se planteraient ou retournerait de mauvais résultats.

Je peux sans trop de risque de mon tromper que le + ne sera jamais supprimé. Au pire plus supporté (dans 10 ans), mais supprimé jamais.

A mon humble avis...
__________________
Mon blog : laurentschneider.com
Mon livre : Advanced Oracle SQL Programming
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2008, 15h52   #13
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par laurentschneider Voir le message
Il y a une grande différence cependant entre /*+RULE*/ et (+)

Si le RBO est supprimé dans une prochaîne version, alors /*+RULE*/ sera sans effet. En aucun cas le résultat de la requête ne peut changer (sinon c'est un bug de prio 1).

Si le (+) était supprimé, alors toutes les requêtes qui employent (+) se planteraient ou retournerait de mauvais résultats.

Je peux sans trop de risque de mon tromper que le + ne sera jamais supprimé. Au pire plus supporté (dans 10 ans), mais supprimé jamais.

A mon humble avis...
Bien sûr nous ne pouvons pas comparer les deux. Mais je signalais qu'Oracle continue à utiliser en interne le hint /*+ RULE */ tout en déconseillant son utilisation.

Personnellemnt, je n'aime pas du tout la syntaxe "inner join" et je préfère la liste des tables séparées par des virgules. Concernant la jointure externe je préfère, par contre, la nouvelle syntaxe qui permet des choses que le (+) ne peut pas exprimer. Même si cette syntaxe a encore des bugs comme tu l'as bien signalé.

En ce qui concerne le "maintien" de la syntaxe (+) je crois que tu as raison ...
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h01.


 
 
 
 
Partenaires

Hébergement Web