0
votes

Utilisation de sous-requête dans la clause de jointure au lieu de nom de colonne

J'essaie de rejoindre une table deux. Une colonne existe dans la table, mais l'autre est un dérivé.

SELECT    ab.id, 
          ab.event_date, 
          CASE 
                    WHEN ab.label = 'ABC' THEN ab.event_date 
                    WHEN ab.label = 'DEF' THEN ab.start_date 
          END deploy_date, 
FROM      ab_bro AB 
LEFT JOIN ab_rev rv 
ON        ab.bro_id = rv.bro_id 
AND 
          ( 
             SELECT 
                 CASE 
                     WHEN AC.label = 'ABC' THEN AC.event_date 
                     WHEN AC.label = 'DEF' THEN AC.start_date 
                  END deploy_date from ab_bro AC) = rv.event_date 


5 commentaires

Cela semble très étrange. Si vous supprimez le SELECT avant le cas , obtenez-vous toujours la même erreur?


@Gordonlinoff qui conduit à une erreur de syntaxe


@A_HORSE_WITH_NO_NAME C'est greenplum. J'ai corrigé la balise. Puisque GP est basé sur des postgres, j'ai supposé qu'il aurait une syntaxe similaire.


@PIRATEX Supprimer le de ab_bro AC ainsi que le Sélectionnez Il n'y a pas besoin de la sous-requête, juste de l'expression de cas.


@Jnevill s'avère que je manquais la fin de la déclaration de cas. Je pense avoir besoin de repos. Merci un tas !!


4 Réponses :


1
votes

Tout ce que vous avez à faire ici est d'utiliser cette expression de cas dans vos critères de jointure: xxx


0 commentaires

0
votes

Si le sous-revue et () renvoie plus que des lignes que vous pouvez utiliser la limite 1 xxx

ou utiliser au lieu de = xxx


3 commentaires

Je peux utiliser la clause limite, mais je pense que cela aurait une incidence sur la logique. Une idée à ce sujet?


Je ne connais pas votre objectif de logique.


Oui, je l'ai essayé. Il est en train de jouer avec la logique. Merci quand même! J'apprécie ton aide.



0
votes

Il serait au moins un peu plus bien rangé pour rejoindre une vue en ligne au lieu de mettre un cas dans votre clause. Cela vous permettra d'éviter de faire dupliquer l'expression . Certains peuvent considérer cela plus propre et plus clair pour toujours utiliser un CTE au lieu d'une vue intégrée: xxx

Vous pouvez penser à ces deux variantes comme création d'une table temporaire contenant les données dérivées comme une colonne ordinaire et rejoignant cela à l'autre table.


4 commentaires

L'extrait que j'ai partagé dans mon message est en fait un très petit morceau d'énorme code SQL et de déplacer toute la logique à CTE peut entraîner une complication sur la complication (pour moi au moins).


@Piratex Il peut sembler être une complication excessive, mais briser parfois une requête dans des pièces Logic peut aider à obtenir la bonne réponse à votre besoin. Je ne connais pas avec Greenplum, mais si vous souhaitez utiliser déploy_date , il doit exister avant que le rejoindre . Étant donné que à partir de et rejoindre se produit généralement tôt dans le processus de requête logique, votre colonne Alias ​​doit exister, nécessiter une CTE ou une sous-requête.


C'est votre code, @piratex. De mon point de vue, cependant, à l'aide d'un CTE est plus simple , sans oublier plus de personnes, que de mettre le cas dans votre clause WHERE. Mais notez que c'est pas mettre la logique entière dans une CTE (ou une vue en ligne). Il met la génération de colonnes synthétiques dans le CTE. S'il s'agit de toutes les colonnes individuelles qui vous dérangent, vous devriez être capable d'abréger toute la liste des colonnes existantes à juste * .


@Johnbollinger merci pour l'entrée. Je vais certainement essayer d'inculquer ces points :)



0
votes
SELECT sub.id,
    sub.event_date,
    sub.deploy_date
FROM (
    SELECT ab.id, 
        ab.event_date, 
        ab.bro_id,
        CASE 
            WHEN ab.label = 'ABC' THEN ab.event_date 
            WHEN ab.label = 'DEF' THEN ab.start_date END as deploy_date, 
    FROM ab_bro AB 
    ) AS sub
LEFT JOIN ab_rev rv ON sub.bro_id = rv.bro_id 
AND sub.deploy_date = rv.event_date; 

0 commentaires