2009-02-05 13 views
8

Estoy intentando crear una vista para la siguiente consulta.Crear vista de MySQL usando 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 

Pero no puedo hacerlo. Estoy usando el buscador de consultas MySql. El error que recibo es:

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

¿Alguien puede ayudarme con esto?

+0

lo que es el error que está recibiendo – Dheer

+0

estoy usando MySQL Query Browser El error que estoy recibiendo es: Una vista sólo puede ser creada a partir de un conjunto de resultados activa de SELECCIONE el comando –

+0

@gnanesh: Perdón por editar su publicación * dos veces *. Debería haber visto el comentario con el mensaje de error anterior. – Tomalak

Respuesta

3

Es posible que desee usar el orden de ID de usuario y la ubicación en la segunda selección. Los nombres de columna deben coincidir 1 a 1 en todas las selecciones de la unión.

EDITAR: para el navegador de consultas, como this señala "Para crear una vista a partir de una consulta, debe haber ejecutado la consulta correctamente. Para ser más precisos, la vista se crea a partir de la última consulta ejecutada con éxito, no necesariamente desde la consulta actualmente en el área de consulta "

por lo que debe ejecutar primero la consulta antes de crear la vista en el navegador de consultas.

El error procede del buscador de consultas y no de mysql.

+0

Probé que ... Mismo resultado –

+0

@Learning, ¿estás intentando estas sugerencias? No necesité ejecutar la consulta primero. Ejecuté alguna otra consulta, luego ejecuté "CREATE VIEW ..." y funcionó bien. – dkretz

+0

no, yo no. No tengo acceso a mysql. Solo estoy tratando de ayudar. – Learning

1

Tiene diferentes tipos que se unen en la misma columna. (Los nombres pueden ser diferentes, pero los tipos tienen que ser iguales, o al menos autocableables). Pero como lo señala @Learning, parece que ha torcido las enumeraciones de las columnas SELECT.

Por si acaso, la sintaxis correcta (que trabajó para mí) es

CREATE VIEW myView 
AS 
SELECT ... 
+0

si los nombres de las columnas son diferentes, ¿con qué nombre de columna se informará cuando seleccionamos * desde la vista? – Learning

+0

El primero. Pruébalo y mira (que es lo que hice). – dkretz

+0

La parte de UNION funciona bien ... Pero cuando trato de crear una vista para esta UNIÓN. Recibo el siguiente error: Una vista solo se puede crear a partir de un conjunto de resultados activo del comando SELECCIONAR Estoy usando el navegador de consultas MySql –

0

El mensaje de error se encuentra en "QueryBrowser.pas", parte 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; 

Se desencadena por a) no tener un resultado activo en el conjunto y b) la consulta con el tipo equivocado.

¿La eliminación de "DISTINCT" hace alguna diferencia? En cualquier caso, esto es un error en QueryBrowser, en lugar de un MySQL. Crear la vista directamente en MySQL debería ser suficiente como una solución alternativa.

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 

¡Intenté esto y funcionó! Gracias a todos :)

1

Solo un pequeño comentario acerca de UNION. UNION solo devuelve los valores distintos de su conjunto de resultados. Por lo tanto, no es necesario usar SELECT DISTINCT combinado con UNION. Probablemente sea mejor para el rendimiento no usar DISTINCT también.

Más información sobre UNION se puede encontrar aquí: link text