0
votes

Rechercher une valeur dans les colonnes de SQL Server

J'ai une table héritée qui n'est en aucun cas normalisée. Voici la définition:

SELECT 
    [ISOCode], 
    [Name], 
    [EnglishName]
FROM
    Countries
WHERE
    [AltCode1] = '[Value]' OR 
    [AltCode2] = '[Value]' OR 
    [AltCode3] = '[Value]' OR 
    [AltCode4] = '[Value]' OR 
    [AltCode5] = '[Value]' OR 
    [AltCode6] = '[Value]' OR 
    [AltCode7] = '[Value]' OR 
    [AltCode8] = '[Value]' OR 
    [AltCode9] = '[Value]' OR 
    [AltCode10]= '[Value]'  


3 commentaires

Vous ne devriez pas avoir 10 colonnes répétitives altcode01 - altcode10 - cela viole la forme première forme normale de la conception de la base de données. Si vous avez plusieurs valeurs - faites ce que vous devrait faire dans une base de données relationnelle - créer une table séparée et établir une relation . De cette façon, vous pouvez trouver beaucoup plus facilement les valeurs correspondantes et vous pouvez avoir des valeurs 1, 5, 10 ou 333 pour toute entrée dans pays - c'est la bonne façon de le faire!


Je comprends la nécessité de faire une base de données relationnelle. Ceci est une base de données tierce partie, c'est pourquoi j'ai dit qu'il était hérité et non normalisé et pourquoi ma requête a l'air de cette façon.


@John Vous pouvez toujours créer un processus d'importation pour nettoyer les données entrantes et la structurer sous forme normalisée, puis utilisez votre meilleure conception pour interroger.


3 Réponses :


2
votes

En supposant que la table dénormalisée est là pour rester, vous pouvez "plier" votre requête avec un opérateur dans : xxx

Ceci fonctionne pour des correspondances exactes car l'égalité est symétrique. Si vous utilisiez un opérateur non symétrique, par exemple comme , vous auriez besoin d'une approche différente pour réduire la duplication de code, telle que la fabrication d'une fonction valorisée de table: xxx


0 commentaires

0
votes

Que diriez-vous d'utiliser un imputilation avec une clause Où? xxx


1 commentaires

Ça marche. Il y a une faute de frappe dans la requête manquante A ")" par T2. En examinant le plan d'exécution de la requête cependant, cela utilise des boucles et des analyses plus imbriquées au lieu de 100% sur l'indice en cluster. C'est une bonne réponse et je vais le marquer, mais je pense que je suis coincé avec la requête brute que j'ai.



0
votes

J'éprouve d'impuche à l'aide de Appliquer . Ensuite, il est facile d'utiliser comme ou = : xxx

Vous pouvez facilement étendre ceci pour montrer qui Correspondances de code: xxx


0 commentaires