2
votes

Filtrer les données dans une table en fonction des données d'une autre table

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?


4 commentaires

"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_1 au lieu de Column_A_2 ? Pensez-vous que Index_1 et Index_2 figureront dans le résultat?


@ radim-bača, oui


@jarlh, je veux dire que je ne voudrais pas en utiliser sauf ces deux tables


3 Réponses :


0
votes

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


0 commentaires

0
votes

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 
    )


0 commentaires

1
votes

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


0 commentaires