J'ai une table de paramètres construite avec 'category' déterminant différents produits, 'varname' étant le nom de la variable, et 'info' étant la valeur du paramètre.Comment comparer élégamment les valeurs d'une même table dans TSQL
donc, par exemple,
select top 6 category, varname, info
from settings_table
where NODE_NAME='HTT-COMM-A'
and section='Module Settings'
and category in ('ProductA', 'ProductB')
order by varname
résultats dans:
category varname info ProductB WEB_ACCESS_ALLOW NO ProductA WEB_ACCESS_ALLOW NO ProductB WEB_ACCESS_BLOCK YES ProductA WEB_ACCESS_BLOCK YES ProductB WEB_ACCOUNT_DETAIL NO ProductA WEB_ACCOUNT_DETAIL YES
je voudrais générer une simple liste des différences entre les valeurs lorsque la catégorie = 'ProduitA' et 'ProductB' . Je peux penser à un certain nombre de façons de le faire avec une table temporaire, ou par un certain nombre de sous-requêtes (par exemple, cette douloureuse):
select a.category, a.varname, a.info , b.category, b.info
from (select category, varname, info, description
from settings_table
where category = 'ProductA') as a,
(select category, varname,info, description
from settings_table
where category = 'ProductB') as b
where a.varname=b.varname and a.info != b.info
mais la méthode ci-dessus (au moins) échoue quand il y a varname dans b qui n'est pas dans a. (Toutes les solutions devraient résoudre ce problème, toutes les différences dans les noms de variable entre a et b devraient également être représentées.)
Ce n'est pas un problème difficile à résoudre d'une manière kludgy, mais je me demande s'il y a une 'bonne façon 'pour le faire avec élégance, sans les sous-sélections horribles ou sans les mises en garde ci-dessus.
Ceci est plus agnostique SQL, mais cette table particulière est dans un serveur MSSQL.
Merci, Rk
Je me sens comme BINARY_CHECKSUM sur les champs en question est le point de départ. Au-delà de ça, j'ai de la difficulté à visualiser comment la jointure pourrait fonctionner, ou comment interroger le nombre de checksum = 1. –