2009-02-05 9 views
8

J'essaie de créer une vue pour la requête suivante.Création d'une vue MySQL en utilisant UNION

SELECT DISTINCT 
    products.pid  AS id, 
    products.pname  AS name, 
    products.p_desc  AS description, 
    products.p_loc  AS location, 
    products.p_uid  AS userid, 
    products.isaproduct AS whatisit 
FROM products 
UNION 
SELECT DISTINCT 
    services.s_id  AS id, 
    services.s_name  AS name, 
    services.s_desc  AS description, 
    services.s_uid  AS userid, 
    services.s_location AS location, 
    services.isaservice AS whatisit 
FROM services 

Mais pas en mesure de le faire. J'utilise MySQL navigateur de requête. L'erreur que j'obtiens est:

A view can only be created from an active resultset of SELECT command

Quelqu'un peut-il m'aider s'il vous plaît avec ceci?

+0

ce qui est l'erreur que vous obtenez – Dheer

+0

J'utilise MySQL Query Browser L'erreur que je reçois est: Une vue ne peut être créé à partir d'un ResultSet actif de Commande SELECT –

+0

@gnanesh: Désolé de modifier votre message * deux fois *. J'aurais dû voir le commentaire avec le message d'erreur plus tôt. – Tomalak

Répondre

3

Vous souhaiterez peut-être swith l'ordre de l'ID utilisateur et l'emplacement dans la deuxième sélection. Les noms de colonnes doivent correspondre de 1 à 1 dans toutes les sélections de l'union.

EDIT: Pour le navigateur de requête, comme le montre this "Pour créer une vue à partir d'une requête, vous devez avoir exécuté la requête avec succès.Pour être plus précis, la vue est créée à partir de la dernière requête exécutée avec succès. la requête actuellement dans la zone de requête "

vous devez donc exécuter la requête avant de créer la vue dans le navigateur de requêtes.

L'erreur provient du navigateur de requêtes et non de mysql.

+0

Essayé que ... Même résultat –

+0

@Learning, essayez-vous ces suggestions? Je n'avais pas besoin d'exécuter la requête en premier. J'ai exécuté une autre requête, puis exécuté "CREATE VIEW ..." et cela a bien fonctionné. – dkretz

+0

non je ne suis pas. Je n'ai pas accès à mysql. J'essaie juste d'aider. – Learning

1

Vous avez différents types étant unis dans la même colonne. (Les noms peuvent être différents, mais les types doivent être les mêmes, ou au moins auto-castable.) Mais comme le souligne @Learning, il semble que vous avez tordu les énumérations de la colonne SELECT.

Juste au cas où, la syntaxe (qui a fonctionné pour moi) est

CREATE VIEW myView 
AS 
SELECT ... 
+0

si les noms de colonne sont différents, quel nom de colonne serait signalé lorsque nous faisons un select * à partir de la vue? – Learning

+0

Le premier. Essayez-le et voir (ce qui est ce que j'ai fait.) – dkretz

+0

La partie UNION fonctionne très bien .. Mais moi quand j'essaie de créer une vue pour cette UNION. Je reçois l'erreur suivante: Une vue ne peut être créée qu'à partir d'un ensemble de résultats actif de la commande SELECT J'ai utilisé MySql query browser –

0

Le message d'erreur est "QueryBrowser.pas", une partie de mysql-gui-tools.

procedure TQueryBrowserForm.SQLCreateViewClick(Sender: TObject); 
// ... 
begin 
    if Assigned(ActiveResultset) and (ActiveResultset.ResultSet.query.query_type = MYX_QT_SELECT)then 
    // ... 
    else 
    ShowError('Creation error', _('A view can only be created from a active resultset of SELECT command.'), []); 
end; 

Il est déclenché par a) ne pas avoir un jeu de résultats actif et b) la requête a le mauvais type.

Le retrait du "DISTINCT" peut-il faire une différence? En tout cas, c'est un bug dans QueryBrowser, plutôt qu'un seul MySQL. Créer la vue directement dans MySQL devrait suffire comme solution de rechange.

5
CREATE VIEW vw_product_services AS 
SELECT DISTINCT products.pid AS id, 
       products.pname AS name, 
       products.p_desc AS description, 
       products.p_loc AS location, 
       products.p_uid AS userid, 
       products.isaproduct AS whatisit 
      FROM products 
      UNION 
      SELECT DISTINCT services.s_id AS id, 
       services.s_name AS name, 
       services.s_desc AS description, 
       services.s_uid AS userid, 
       services.s_location AS location, 
       services.isaservice AS whatisit 
      FROM services 

J'ai essayé ceci et cela a fonctionné! Merci à tous :)

1

Juste une petite remarque sur UNION. UNION renvoie uniquement les valeurs distinctes de votre resultset. Il n'est donc pas nécessaire d'utiliser SELECT DISTINCT associé à UNION. Probablement mieux pour les performances de ne pas utiliser DISTINCT aussi.

Plus d'info sur UNION se trouve ici: link text

Questions connexes