0
votes

Comment minimiser l'utilisation de la sous-requête

J'ai les tables suivantes et je voudrais calculer le chiffre de vente. J'ai utilisé une certaine sous-requête pour le faire. Puis-je n'utiliser pas de sous-requête et n'utilisez pas la variable de table pour le faire? XXX PRE>

subquery 1 will return 
UK, 6924
USA, 6680
China, 100

subquery 2 will return
UK, 315
USA, 77

final result
UK, 6924, 315
USA, 6680, 77,
China, 100, null  


5 commentaires

Les échantillons de données et les résultats attendus nous aideront à vous aider.


Semble une approche raisonnable. Pourquoi voulez-vous le changer?


Probablement, cependant, vous aurez besoin d'au moins une sous-requête.


Pourquoi ne faites-vous pas juste que vous rejoignez toutes les tables et appelez-en une groupeby à la fin plutôt que pour toujours faire un groupe de groupe dans une sous-requête? L'optimiseur de requêtes doit être suffisamment intelligente pour déterminer comment faire cela efficacement


@Karl: Parce que ces jointures seraient nombreuses à plusieurs et que les sommes seraient mauvaises


3 Réponses :


0
votes

Vous pouvez faire quelque chose comme suit pour rejoindre les résultats de la requête individuelle en un comme suit

select aa.country, aa.popu, bb.amou,cc.smou from 
    (select sum(population) as popu, country from population group by country) aa
inner join 
    (select sum(amount) as amou, country from sales_amount group by countr) bb
on aa.country = bb.country inner join
    (select sum(sales) as smou, country from sales_amount group by countr) cc
on bb.country = cc.country
-- inner join ..  so on as you wrote....


2 commentaires

C'est la même chose que la requête originale, juste un ordre alternatif de jointures, aucun être humain n'utilisera jamais :-)


D'accord, je ne vois aucune autre option pour lire les résultats lorsque l'on veut combiner des résultats de différentes tables en un seul résultat de la requête! Autre que, écrire un CTE ou créer une vue ou quelque chose comme ci-dessus ..



0
votes

Edit, OK, bien alors pourquoi ne pas créer de vues où l'agrégation est déjà effectuée, surtout si cela est des informations que vous allez souvent utiliser. Si la lisibilité est votre principale préoccupation, cela devrait aider. E.G.:

SELECT
vw_aggregated_population.country,
popu, 
amou,
FROM vw_aggregated_population
LEFT JOIN vw_aggregated_sales_amount
ON vw_aggregated_population.country=vw_aggregated_sales_amount.country
GROUP BY vw_aggregated_population.country

Sollés par P>

CREATE VIEW vw_aggregated_population AS
SELECT sum(population) AS popu, country 
FROM population GROUP BY country

CREATE VIEW vw_aggregated_sales_amount AS
SELECT sum(amount) AS amou, country 
FROM sales_amount GROUP BY country


4 commentaires

Parce que ces jointures seraient beaucoup à plusieurs et que les sommes seraient mauvaises. Les performances supplémentaires seraient horribles en raison du nombre d'explosions de lignes.


Ok, vous devriez peut-être indiquer cela dans votre question. Voir la réponse mise à jour


Ceci est évident, pourquoi devriez-vous regrouper par une colonne déjà unique?


Vous seriez surpris de savoir combien de ces types de choses que j'ai vues dans les questions de si ...



0
votes

Vous pouvez utiliser Inscrivez-vous complète ou Groupe par avec Union tout pour obtenir tous les lignes dans toutes les tables. Voici un exemple utilisant la deuxième approche: xxx

Il doit être clair comment développer cela pour plus de tables.


2 commentaires

Étant donné que de nombreuses tables sont impliquées et que nous ne sommes pas au courant de la taille des données. Donc, du point de vue de la performance, lequel préféreriez-vous? Rejoindre complet ou union tout avec le groupe par.


@Ankitbajpai. . . Je mets l'approche Union tout car elle généralise plus facilement. Je ne suis pas vraiment sûr qui fonctionnerait mieux dans SQL Server. Si vous avez une grande quantité de données, cela vaut la peine de comparer les performances. Joindre complet a quelques frais généraux supplémentaires comparés à celui d'un autre rejoindre s. groupe par a également des frais généraux. Mais si vous avez des index sur pays dans chacun des sous-titres, le groupe par devrait être très raisonnable.