CONTESTARÁN - MySQL - Función SELECT en un SELECT

Louis Margot

Para mi problema, no sé cómo utilizar la función de selección en otro SELECT (con MySQL).

A solas, las obras SELECT (todas las partes del código) grandes, pero cuando pongo el código completo, dice phpMyAdmin ' subconsulta devuelve más de 1 fila '.

El código completo es:

INSERT INTO `vente` (`Quantite`, `Année`, `Mois`, `Jour`, `ID_TypeEquipement`, `ID_Divinite`, `ID_Pouvoir`, `ID_Lieu`, `ID_DemiDieu`)
    SELECT `_info_ventes_1er_siecle`.`Quantité`, `_info_ventes_1er_siecle`.`Année`, `_info_ventes_1er_siecle`.`Mois`, `_info_ventes_1er_siecle`.`Jour`
        , (SELECT `ID`
            FROM `typeequipement`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Objet` = `typeequipement`.`Denomination`)
        , (SELECT `ID_Divinite`
            FROM `mois`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Mois` = `mois`.`Nom`)
        , (SELECT `ID`
            FROM `pouvoir`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Pouvoir` = `pouvoir`.`Denomination`)
        , (SELECT `ID_Lieu`
            FROM `lieu`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Province` = `lieu`.`Province`
            AND `_info_ventes_1er_siecle`.`Ville` = `lieu`.`Ville`)
        , (SELECT `ID_Lieu`
            FROM `lieu`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Ville` = `lieu`.`Ville`)
    FROM `_info_ventes_1er_siecle`;

Funciona cuando intento esto:

SELECT `ID`
    FROM `typeequipement`
    INNER JOIN `_info_ventes_1er_siecle`
    ON `_info_ventes_1er_siecle`.`Objet` = `typeequipement`.`Denomination`

O esto :

SELECT `_info_ventes_1er_siecle`.`Quantité`, `_info_ventes_1er_siecle`.`Année`, `_info_ventes_1er_siecle`.`Mois`, `_info_ventes_1er_siecle`.`Jour`

Por lo que el error es sólo cuando agrego las "(SELECT ...)" partes. Es probable que la sintaxis. Para ser honesto, no sé, es por eso que estoy aquí.


Gracias, espero que pueda corregir este error antes de la fecha límite. ;)

Bill Karwin:

Los medios de error que utilizan subconsultas escalares que deben regresar 1 fila y 1 columna en el contexto de usarlos, sino que, de hecho, no garantizan que volverán 1 fila.

Supongo que usted quiere que su SELECT para volver las columnas de las tablas relacionadas, donde el valor de la tabla corresponde relacionados con la fila de la consulta externa. Pero la forma en que lo ha escrito, que no va a ocurrir. Usted está creando un JOIN a una referencia de tabla diferente a _info_ventes_1er_siecledentro de cada sub consulta. Por lo que volverá muchos valores de la sub consulta, por cualquier fila coincidente, no sólo para el que corresponde a la fila de la tabla externa. Sólo nombrar a la misma mesa no significa que sea la misma referencia de tabla.

La solución utilizando LIMITno va a funcionar bien, en general. No va a devolver la fila de la sub consulta que corresponde a la fila de la consulta externa. Sólo se devolverá 1 fila arbitraria de la subconsulta.

Pero puede que no sea necesario el uso de subconsultas en absoluto. Yo utilice Conectar:

INSERT INTO `vente` (`Quantite`, `Année`, `Mois`, `Jour`, `ID_TypeEquipement`,
 `ID_Divinite`, `ID_Pouvoir`, `ID_Lieu`, `ID_DemiDieu`)
    SELECT 
      i.`Quantité`,
      i.`Année`,
      i.`Mois`,
      i.`Jour`
      t.`ID`,
      m.`ID_Divinite`,
      p.`ID`,
      l2.`ID_Lieu`,
      l1.`ID_Lieu`
    FROM `_info_ventes_1er_siecle` AS i
    LEFT JOIN `typeequipement` AS t ON i.`Objet` = t.`Denomination`
    LEFT JOIN `mois` AS m ON i.`Mois` = m.`Nom`
    LEFT JOIN `pouvoir` AS p ON i.`Pouvoir` = p.`Denomination`
    LEFT JOIN `lieu` AS l1 ON i.`Ville` = l1.`Ville`
    LEFT JOIN `lieu` AS l2 ON i.`Ville` = l2.`Ville` AND i.`Province` = l2.`Province`

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=402898&siteId=1
Recomendado
Clasificación