ОТВЕТИЛ - MySQL - Функция SELECT в SELECT - PullRequest
0 голосов
/ 29 марта 2020

Для моей проблемы, я не знаю, как использовать функцию SELECT в другом SELECT (с MySQL).

В одиночку SELECT работает (все части кода) замечательно, но когда я поставить полный код, PHPMyAdmin говорит: « Подзапрос возвращает более 1 строки ».

Полный код:

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`;

Работает, когда я пытаюсь это:

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

Или это:

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

Так что ошибка возникает только тогда, когда я добавляю части ", (SELECT ...)". Это, вероятно, синтаксис. Если честно, я не знаю, поэтому я здесь.


Спасибо, надеюсь, я смогу исправить эту ошибку до истечения срока. ;)

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Ошибка означает, что вы используете скалярные подзапросы , которые должны возвращать 1 строку и 1 столбец в контексте, в котором вы их используете, но на самом деле они не гарантируют, что вернут 1 строку.

Я предполагаю, что вы хотите, чтобы ваш SELECT возвращал столбцы из связанных таблиц, где значение в связанной таблице соответствует строке из внешнего запроса. Но так, как вы это написали, этого не произойдет. Вы создаете JOIN для другой ссылки на таблицу на _info_ventes_1er_siecle в каждом подзапросе. Таким образом, он вернет много значений из подзапроса для любой совпадающей строки, а не только для значения, соответствующего строке из внешней таблицы. Простое присвоение имени одной и той же таблице не делает ее той же ссылкой на таблицу.

В целом решение, использующее LIMIT, также не будет работать. Он не вернет строку из подзапроса, которая соответствует строке во внешнем запросе. Он вернет только 1 произвольную строку из подзапроса.

Но вообще не обязательно использовать подзапросы. Я бы использовал вместо JOIN:

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`
0 голосов
/ 29 марта 2020

Как насчет этого с LIMIT 1 в каждом подзапросе?

Примечание: Используйте предложение ORDER BY с LIMIT 1, иначе вы получите неожиданные результаты.

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` LIMIT 1)
        , (SELECT `ID_Divinite`
            FROM `mois`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Mois` = `mois`.`Nom` LIMIT 1)
        , (SELECT `ID`
            FROM `pouvoir`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Pouvoir` = `pouvoir`.`Denomination` LIMIT 1)
        , (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` LIMIT 1)
        , (SELECT `ID_Lieu`
            FROM `lieu`
            INNER JOIN `_info_ventes_1er_siecle`
            ON `_info_ventes_1er_siecle`.`Ville` = `lieu`.`Ville` LIMIT 1)
    FROM `_info_ventes_1er_siecle`;
...