2013-06-21 5 views
-1

je la requête SQL suivante:UNION - MySQL vs SQLight

SELECT * 
FROM (SELECT sku, 
       price 
     FROM pricelist_98 
     UNION 
     SELECT sku, 
       price 
     FROM pricelist_10) AS result 
WHERE sku = '5101863' 
GROUP BY sku 

Je veux obtenir le prix de pricelist_98 lorsque les produits spécifiés existe là-bas, sinon le prix de pricelist_10. Cela devrait être dynamiquement extensible avec des tables de prix plus nombreuses et différentes. La première liste de prix contenant le produit doit être affichée.

Lorsque j'interroge mon serveur MySQL, j'obtiens le résultat volitionnel. J'ai également une application iPad avec la même structure de base de données dans une base de données SQLight. Ici, je reçois la ligne de pricelist_10, bien que le produit existe dans pricelist_98.

Je suis curieux de connaître le contexte technique pour lequel la requête est traitée différemment. Aussi, je suis à la recherche d'une solution à une seule requête qui fonctionne aussi dans ma base de données SQLight.

EDIT Notez également que WHERE est facultatif. J'ai besoin du SELECT pour retourner chaque produit dans au moins une table de liste de prix que je demande.

+1

Qui a créé différents tableaux de tarifs? Avez-vous essayé SQLDark? – Kermit

+0

La raison pour laquelle cela a été fait est que différents clients sont assignés à des listes de prix différentes et que certains tarifs ont une liste de prix de base pour les produits qui n'ont pas de prix spécial pour ce client. Dans cet exemple, pricelist_98 contient seulement environ 10 produits et a pricelist_10 comme liste de prix de base. Cette structure est prédéfinie et je ne peux rien y changer. Et non, je n'ai pas essayé SQLDark. Je suis coincé avec SQLight. – m0tv

+0

1. SKU est-il unique dans une seule table? 2. Pourquoi utilisez-vous GROUP BY? –

Répondre

0

Lorsque vous utilisez GROUP BY, le choix de la ligne à retourner est arbitraire - SQL n'impose aucune commande sauf si vous utilisez ORDER BY. Voici comment spécifier explicitement la préférence:

SELECT main.sku, main.price 
FROM (SELECT sku, 
       price, 
       1 preference 
     FROM pricelist_98 
     WHERE <whatever> 
     UNION 
     SELECT sku, 
       price, 
       2 preference 
     FROM pricelist_10 
     WHERE <whatever>) AS temp1) AS main 
JOIN (SELECT sku, min(preference) preference 
     FROM (SELECT sku, 
        1 preference 
       FROM pricelist_98 
       WHERE <whatever> 
       UNION 
       SELECT sku, 
        2 preference 
       FROM pricelist_10 
       WHERE <whatever>) AS temp2 
     GROUP BY sku) AS temp3 
ON main.sku = temp3.sku AND main.preference = temp3.preference 

Il est également préférable de mettre la clause WHERE dans les sous-requêtes. Sinon, la base de données doit fusionner les tables entières avant de faire la recherche, au lieu de fusionner deux lignes (théoriquement, l'optimiseur de requêtes pourrait faire cette transformation, mais je serais très surpris si MySQL ou SQLite le faisaient).

Il peut y avoir un gain d'efficacité si vous créez une vue qui implémente l'union avec les paramètres de préférence.

+0

Merci pour le conseil avec la clause where. Malheureusement, je ne peux pas utiliser votre solution car le WHERE est optionnel. J'ai besoin de tous les produits dans les tables de liste de prix, donc je ne peux pas utiliser LIMIT 1. – m0tv

+0

Prenez l'endroit où vous voulez ou déplacez-le dehors. Devrait obtenir ce que vous voulez, il sera juste un peu inefficace –

+0

Révisé la requête de travailler pour une clause 'WHERE 'qui peut correspondre à plusieurs SKU. Ou vous pouvez le laisser entièrement et obtenir la liste complète des prix. – Barmar