Dénominateur commun (colonne) dans la requête SQL

J'ai un site Web qui a des produits ajoutés aux catégories. Ces catégories sont classées hiérarchiquement. Ainsi, un produit appartient à une catégorie et à tous les parents de cette catégorie. Nous avons un tableau d'index de search qui ressemble à ceci:

product_id | category_level_1 | category_level_2 | category_level_3 | property_a | property_b -------------------------------------------------------------------------------- 1 | category1 | category2 | category3 | 1 | 2 2 | category1 | category2 | category4 | 1 | 3 

Si j'exécute une requête sur le filtrage de la table d'index de search de produits sur certaines propriétés (par exemple, propery_a et property_b), je veux également savoir quelle est la plus petite catégorie de dénominateur commun. Dans la catégorie d'exemple ci-dessus2.

J'ai une requête de travail qui returnnera un resultset à mon application, y compris les colonnes category_level_1, category_level_2 et category_level_3. Tout en bouclant le résultat, je peux déterminer la plus petite catégorie de dénominateur commun.

Cependant, si je pouvais déterminer le plus petit dénominateur commun dans la première requête, cela me permettrait d'économiser beaucoup de transport de données (l'tree de la catégorie est jusqu'à 9 niveaux dans la vie réelle). Quelqu'un at-il une suggestion comment déterminer la catégorie commune dans une requête qui filter également sur les propriétés (WHERE property_a = 1)?

Sur la base de la réponse d'ARTM, voici enfin ma solution:

La réalité est plus complexe mais vous me mettez sur la bonne voie! Merci! La requête concernant les propriétés peut être très complexe: WHERE (property_a = 1 AND (Property_2 = 2 ou Peroperty_2) = 3 AND Property_3 = 4) etc etc. Appelons cela "property_query".

J'ai eu ça pour travailler:

 SELECT product_id, category as common_category FROM ( SELECT Product_id, COUNT(*) OVER (PARTITION BY 1) AS productCount FROM <tablename> WHERE <property_query>)) A INNER JOIN ( select count(*) as categoryCount , category from (select category_level_1 as cat, from <tablename> WHERE <property_query> union all select category_level_2, from <tablename> WHERE <property_query> union all select category_level_3, from <tablename> WHERE <property_query>)c group by cat ) B ON B.categoryCount = A.productCount 

Maintenant, je dois le tester pour la performance ….

Vous pouvez get l'union de toutes les colonnes de catégorie où property_a est ce que vous searchz, et get le nombre groupé par catégorie. Vous pouvez ensuite join l'autre sélection interne dans laquelle le nombre de lignes avec les critères de search est le même que le nombre groupé par chaque catégorie.

 SELECT product_id, cat AS CommonDeno FROM ( select COUNT(*) OVER (PARTITION BY property_a) AS ProductCountWithProperty_A , product_id , pr.property_a from yourTable ) A INNER JOIN (select count(*) as catCount , cat from ( select category_level_1 as cat, property_a as p from yourTable union all select category_level_2, property_a from yourTable union all select category_level_3, property_a from yourTable ) c where cp = 1 group by cat ) i on i.catCount = A.ProductCountWithProperty_A AND A.property_a = 1 

D'abord, vous n'avez pas besoin de boucler le jeu de résultats dans la deuxième étape.

 with result(product_id, category_level_1 , category_level_2 , category_level_3, property_a , property_b) as ( --your first query here ) select denominator= case min(category_level_1) when max(category_level_1) then min(category_level_1) + case min(category_level_2) when max(category_level_2) then min(category_level_2) + case min(category_level_3) when max(category_level_3) then min(category_level_3) else '' end else '' end end from result having min(category_level_1) = max( category_level_1) 

Ensuite, si vous êtes sur sql 2014, vous pouvez intégrer cette logique dans la première requête avec windowing max() over(), min() over()