J'ai deux tableaux présentés ci-dessous. La première table contient des informations sur les index. Chaque index peut être appliqué à une ou plusieurs colonnes. La deuxième table contient un ensemble de paires: nom de la table - nom de la colonne.
J'ai besoin d'une manière ou d'une autre d'obtenir une liste d'index de la table n ° 1 appliquée aux colonnes de la table n ° 2. Le résultat doit inclure toutes les colonnes des index filtrés (voir le tableau des résultats ci-dessous).
#1 +---------------------------------------+ | Index name | Table name | Column name | +---------------------------------------+ | Index_1 | Table_A | Column_A_1 | | Index_1 | Table_A | Column_A_2 | | Index_2 | Table_A | Column_A_1 | | Index_2 | Table_A | Column_A_3 | | Index_3 | Table_B | Column_B_1 | | Index_3 | Table_B | Column_B_2 | | Index_4 | Table_C | Column_C_1 | +---------------------------------------+ #2 +--------------------------+ | Table name | Column name | +--------------------------+ | Table_A | Column_A_2 | | Table_B | Column_B_1 | +--------------------------+ Result: +---------------------------------------+ | Index name | Table name | Column name | +---------------------------------------+ | Index_1 | Table_A | Column_A_1 | | Index_1 | Table_A | Column_A_2 | | Index_3 | Table_B | Column_B_1 | | Index_3 | Table_B | Column_B_2 | +---------------------------------------+
Puis-je faire cela par une opération "SELECT" sans utiliser de table supplémentaire? Si oui, comment?
3 Réponses :
utiliser la jointure
select t1.* from table1 t1
join table2 t2
on t1.table_name=t2.table_name
where t1.index_name in ('Index_1','Index_3') --- provide filter values
EXISTS (semi-join) est encore plus adapté:
SELECT t1.* FROM table1 t1
WHERE EXISTS(
SELECT * FROM table2 t2
WHERE
t1.table_name=t2.table_name and t1.col_name=t2.col_name
)
Un JOIN ou EXISTS direct ne le coupera pas, puisque vous voulez afficher un ensemble (un index complet) si au moins une de ses lignes satisfait une condition .
Vous devez d'abord déterminer quels index correspondent à l'autre table, puis afficher toutes ses lignes:
SELECT
I.*
FROM
IndexTable AS I
WHERE
EXISTS (
SELECT
'at least one column match'
FROM
IndexTable AS I2
INNER JOIN ColumnsTable AS C ON
C.TableName = I2.TableName AND
C.ColumnName = I2.ColumnName
WHERE
I.IndexName = I2.IndexName)
ORDER BY
I.IndexName,
I.TableName,
I.ColumnName
Ou avec EXISTS : p>
;WITH IndexMatches AS
(
SELECT DISTINCT
I.IndexName
FROM
IndexTable AS I
INNER JOIN ColumnsTable AS C ON
C.TableName = I.TableName AND
C.ColumnName = I.ColumnName
)
SELECT
I.*
FROM
IndexTable AS I
INNER JOIN IndexMatches AS M ON I.IndexName = M.IndexName
ORDER BY
I.IndexName,
I.TableName,
I.ColumnName
"sans utiliser de table supplémentaire" - cela signifie-t-il sans troisième table - ou sans t2 ou sans t1?
quel est le résultat attendu si la table n ° 2 contient
Column_A_1au lieu deColumn_A_2? Pensez-vous queIndex_1etIndex_2figureront dans le résultat?@ radim-bača, oui
@jarlh, je veux dire que je ne voudrais pas en utiliser sauf ces deux tables