IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Requete jointure rejets [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut Requete jointure rejets
    Salut,

    Voici mon problème :

    J'ai deux tables et veux faire une jointure (left) entre elles en gardant les rejets, une des condition est un between. Mais je désire ne pas le mettre dans la condition de jointure

    J'ai écrit un petit script pour illustrer , ce sera plus simple à expliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    SELECT * INTO #temp_a
    FROM
    (
    SELECT 'A' as cle, 1 as val
    UNION
    SELECT 'A' as cle, 3 as val
    UNION
    SELECT 'A' as cle, 7 as val
    UNION
    SELECT 'B' as cle, 2 as val
    UNION
    SELECT 'B' as cle, 6 as val
    UNION
    SELECT 'B' as cle, 14 as val
    )TAB
     
    SELECT * INTO #temp_b
    FROM
    (
    SELECT 'A' as cle, 2 as r_low, 4 as r_up
    UNION
    SELECT 'A' as cle, 5 as r_low, 9 as r_up
    UNION
    SELECT 'A' as cle, 10 as r_low, 15 as r_up
    UNION
    SELECT 'B' as cle, 1 as r_low, 5 as r_up
    UNION
    SELECT 'B' as cle, 6 as r_low, 11 as r_up
    UNION
    SELECT 'B' as cle, 12 as r_low, 15 as r_up
    )TAB
     
    -- Résultat attendu
    SELECT 
    	a.cle
    	,a.val
    	,b.r_low
    	,b.r_up 
    FROM #temp_A a
    LEFT JOIN #temp_B b
    ON a.cle = b.cle
    AND a.val BETWEEN b.r_low AND b.r_up
     
    --Objectif, ne pas mettre de between dans la condition de jointure ==>
    SELECT 
    	a.cle
    	,a.val
    	,b.r_low
    	,b.r_up 
    FROM #temp_A a
    LEFT JOIN #temp_B b
    ON a.cle = b.cle
    WHERE  a.val BETWEEN b.r_low AND b.r_up
    OR .... ?
    L'origine de ma demande vient du fait que ce n'est pas du TSQL mais plutot du HQL (Hive) qui ne supporte pas autre chose que les égalités dans les conditions de jointure
    Je me disais qu'il y aurait peut-être une solution en sql de base.
    Une idée? (je post ici car ma demande est du simple sql)
    Je n'ai pas l'impression qu'il existe d'autre solution simple...

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Citation Envoyé par vinch999 Voir le message
    L'origine de ma demande vient du fait que ce n'est pas du TSQL mais plutot du HQL (Hive) qui ne supporte pas autre chose que les égalités dans les conditions de jointure
    Avez-vous essayé les inégalités ? ça pourrait remplacer le BETWEEN

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Pas possible malheureusement.
    "Only equality joins, outer joins, and left semi joins are supported in Hive. Hive does not support join conditions that are not equality conditions"


  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    alors vous pouvez essayer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SELECT 
    	a.cle
    	,a.val
    	,b.r_low
    	,b.r_up 
    FROM #temp_A a
    INNER JOIN #temp_B b
        ON a.cle = b.cle
    WHERE  a.val BETWEEN b.r_low AND b.r_up
    UNION ALL
    SELECT 
    	a.cle
    	,a.val
    	,NULL
    	,NULL 
    FROM #temp_A a
    WHERE NOT EXISTS(
    	SELECT 1
    	FROM #temp_B b
    	WHERE a.cle = b.cle
    	AND a.val BETWEEN b.r_low AND b.r_up
    )

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Ca fonctionne en tsql mais pas en hql malheureusement. Même problème:
    SubQuery expression refers to both Parent and SubQuery expressions and is not a valid join condition.
    De nouveau il refuse dès que l'on met autre chose qu'une égalité.

    Je ne suis peut-être pas dans la section du forum la plus adaptée vu que c'est une limitation hql...

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Quelle est votre version de hive ?

    La doc semble indiquer que cette requete est acceptée depuis la 0.13...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    Je suis pourtant en version Hive 1.2.1.2.3.

    Elle est acceptée, mais uniquement avec des égalités entre champs.

    J'ai testé :
    - a.col1 = b.col1 ==>OK
    - a.col1 = b.col1 AND a.col2 = b.col2==>OK
    -a.col1 >= b.col1 ==> NOT OK
    - a.col1 BETWEEN b.col1 AND b.col2 ==> NOT OK

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    pfiou.

    Hive c'est bien, mais il faut pas avoir plusieurs tables

    hmmm... et ça : ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    SELECT 
    	cle
    	,val
    	,MAX(r_low)
    	,MAX(r_up )
    FROM (
    	SELECT 
    		a.cle
    		,a.val
    		,b.r_low
    		,b.r_up 
    	FROM #temp_A a
    	INNER  JOIN #temp_B b
    	ON a.cle = b.cle
    	WHERE  a.val BETWEEN b.r_low AND b.r_up
    	UNION ALL
    	SELECT 
    		a.cle
    		,a.val
    		,NULL
    		,NULL 
    	FROM #temp_A a
    ) T
    GROUP BY 
    	cle
    	,val

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Points : 71
    Points
    71
    Par défaut
    En effet

    ça marche !
    C'est quand même dommage de devoir passer par là pour avoir le bon résultat mais bon, pas le choix.

    Merci pour ton aide aieeeuuuuu !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requete Jointure Externe...Soucis!!
    Par paflolo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/03/2006, 11h25
  2. [requetes / Jointures externes] : expression de jointure
    Par Ptit_boeuf dans le forum Langage SQL
    Réponses: 5
    Dernier message: 28/07/2005, 16h42
  3. Pb Requete jointure (3 fois ?)
    Par bob.lapointe dans le forum Langage SQL
    Réponses: 4
    Dernier message: 05/03/2005, 14h59
  4. [Requete] jointure externe -> where
    Par MrDuChnok dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/07/2004, 15h48
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo