Comment puis-je dériver la condition de filtrage en BTEQ à base de lignes comme indiquées ci-dessous?
Tableau B: P>
SELECT * FROM TABLE A WHERE CODE IN ('AAA') AND DESC IN ('BBB') AND TYPE IN ('CCC')
4 Réponses :
Une approche ici serait d'agréger par cola code>, puis ajoutez trois assertions pour la clé / les valeurs que vous attendez:
SELECT
COLA
FROM yourTable
GROUP BY
COLA
HAVING
COUNT(CASE WHEN COLB = 'CODE' AND COLC = 'AAA' THEN 1 END) > 0 AND
COUNT(CASE WHEN COLB = 'DESC' AND COLC = 'BBB' THEN 1 END) > 0 AND
COUNT(CASE WHEN COLB = 'TYPE' AND COLC = 'CCC' THEN 1 END) > 0;
Colb CODE> et
COLC CODE> est dans la table
B CODE> BL OP VOULEZ filtrer la table
A code>. Vous avez seulement interrogé une table, alors comment est-ce censé travailler?
Vous pouvez ré-écrire la requête à l'aide d'une expression de table commune.
SELECT * FROM ( SELECT COLA, CASE WHEN COLB = 'Code' THEN COLC ELSE NULL AS Code , CASE WHEN COLB = 'DESC' THEN COLC ELSE NULL AS DESC , CASE WHEN COLB = 'TYPE' THEN COLC ELSE NULL AS TYPE FROM TABLEB ) AS t WHERE CODE IN ('AAA') AND DESC IN ('BBB') AND TYPE IN ('CCC');
Colb CODE> et
COLC CODE> est dans la table
B CODE> BL OP VOULEZ filtrer la table
A code>. Vous ne faites rien avec la table
A code>, alors comment est-ce censé fonctionner?
Table de filtre A code> à l'aide des valeurs du tableau
B code> et en supposant qu'une colonne sans valeurs dans le tableau
B code> signifie non filtré sur cette colonne , vous pouvez le faire comme ceci:
SELECT *
FROM A
WHERE ( NOT EXISTS ( SELECT * FROM B WHERE B.COLB = 'CODE' )
OR A.CODE IN ( SELECT B.COLC FROM B WHERE B.COLB = 'CODE' ) )
AND ( NOT EXISTS ( SELECT * FROM B WHERE B.COLB = 'DESC' )
OR A.DESC IN ( SELECT B.COLC FROM B WHERE B.COLB = 'DESC' ) )
AND ( NOT EXISTS ( SELECT * FROM B WHERE B.COLB = 'TYPE' )
OR A.TYPE IN ( SELECT B.COLC FROM B WHERE B.COLB = 'TYPE' ) )
Je ne vois aucune relation entre les tables "a" et "b" que ce soit et suppose que c'est juste une faute de frappe et qu'il n'y a qu'une seule table.
@TimbieGeleisen La relation est que b.colb code> contient le nom i> d'une colonne dans le tableau
A code> et
b.colc code > Contient la valeur pour correspondre dans ce tableau
une colonne code>. Par devinez i> est que la valeur entière de
b.cola code> représente la table
A code>. C'est la seule façon dont la question ait du sens pour moi, mais cela fait beaucoup de sens de cette façon.
Vous pouvez utiliser La mise en garde est que cela suppose qu'il y a au moins Une de chaque valeur dans le tableau Vous pouvez gérer les valeurs manquantes. Une méthode utilise des sous-requêtes supplémentaires: P> dans code> ou
existant code> à cet effet:
B code>. p>
select a.*
from a
where (a.code in (select b.colc from b where b.colb = 'CODE') or
not exists (select 1 from b where b.colb = 'CODE')
) and
(a.desc in (select b.colc from b where b.colb = 'DESC') or
not exists (select 1 from b where b.colb = 'DESC')
) and
(a.type in (select b.colc from b where b.colb = 'TYPE') or
not exists (select 1 from b where b.colb = 'TYPE')
);
Ajoutez quelques autres données d'échantillonnage et spécifiez également le résultat attendu.
Combien de tables existent réellement ici?
On dirait que vous essayez de comparer la valeur de
colb code> et
COLC code> dans une rangée. Si tel est le cas, vous pouvez éventuellement utiliser un opérateur
comme code> ou une comparaison de matrice. Quel est le type de données de
colc code>? Quelle est votre définition de
dans code> dans votre pseudo-requête?
Cela semble être une demande d'utilisation de la table B pour générer des SQL dynamiques avec un nombre variable de prédicats faisant référence à des noms de colonne arbitraires et potentiellement des listes de valeurs de colonne. Bien qu'il soit possible de le faire dans BTEQ, vous préférez probablement mieux utiliser une langue de procédure (procédure stockée dans la base de données, le script Python sur le client, etc.) pour construire la requête.