【问题标题】:MySQL - Function SELECT in a SELECTMySQL - SELECT 中的函数 SELECT
【发布时间】:2020-03-29 16:04:47
【问题描述】:

对于我的问题,我不知道如何在另一个 SELECT(使用 MySQL)中使用 SELECT 函数。

单独,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 ...)”部分时。 大概是语法吧。老实说,我不知道,这就是我在这里的原因。


谢谢,我希望我能在截止日期前修复这个错误。 ;)

【问题讨论】:

  • 何不...我尝试添加一个“嗨”,但网站不想添加这个。
  • 在每个子查询上尝试LIMIT 1,因为您当前的子查询返回超过 1 个结果
  • @LouisMargot。 . .错误似乎很明显。你不明白错误的哪一部分?
  • 在没有插入的情况下进行选择,看看它是否按您希望的那样运行,但我不这么认为。
  • (至少)其中一个子查询返回不止一行,正如错误清楚地表明的那样。检查哪些/哪些并更正它/它们以仅返回最多一行。

标签: mysql sql select


【解决方案1】:

该错误表示您正在使用 标量子查询,在您使用它们的上下文中必须返回 1 行和 1 列,但它们实际上并不能保证它们会返回 1 行。 p>

我猜您希望您的 SELECT 返回相关表中的列,其中相关表中的值对应于外部查询中的行。但按照你写的方式,这不会发生。您正在为每个子查询中对 _info_ventes_1er_siecle 的不同表引用创建 JOIN。所以它会从子查询中返回许多值,对于 any 匹配的行,而不仅仅是与外部表中的行对应的那个。只是命名同一个表并不能使其成为同一个表引用。

一般来说,使用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`

【讨论】:

    【解决方案2】:

    在每个子查询中使用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`;
    

    【讨论】:

    • 请注意,没有ORDER BYLIMIT 会产生随机结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2012-09-26
    • 2012-01-25
    • 2017-10-22
    相关资源
    最近更新 更多