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
4 Réponses :
Tout ce que vous avez à faire ici est d'utiliser cette expression de cas dans vos critères de jointure:
Si le sous-revue et () renvoie plus que des lignes que vous pouvez utiliser la limite 1 ou utiliser au lieu de = p>
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.
Il serait au moins un peu plus bien rangé pour rejoindre une vue en ligne au lieu de mettre un cas code> code> dans votre 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. P> p> où code> clause. Cela vous permettra d'éviter de faire dupliquer l'expression code> code>. Certains peuvent considérer cela plus propre et plus clair pour toujours utiliser un CTE au lieu d'une vue intégrée:
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 code>, il doit exister avant que le
rejoindre code>. Étant donné que
à partir de code> et
rejoindre code> 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 i>, sans oublier plus de personnes, que de mettre le cas code> dans votre clause WHERE. Mais notez que c'est pas i> 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
* code>.
@Johnbollinger merci pour l'entrée. Je vais certainement essayer d'inculquer ces points :)
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;
Cela semble très étrange. Si vous supprimez le
SELECT CODE> avant le cas code> code>, 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 code> ainsi que le
Sélectionnez CODE> 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 !!