Mysql 视图 - 连接中的选择数据返回超过 1 行

Posted

技术标签:

【中文标题】Mysql 视图 - 连接中的选择数据返回超过 1 行【英文标题】:Mysql view - Select data in join returns more than 1 row 【发布时间】:2017-03-17 00:54:11 【问题描述】:

我会感谢一些有关 mysql 的帮助。

这是我的架构的一部分(第一个表称为“站点”): db_schema

sites.contractor 链接到 companyornaturalperson.idCompaniesOrNaturalPerson

我正在构建一个视图,以便从这两个表中收集一些信息。 我需要将 sites.latitude、sites.longitude 和承包商名称 (companiesornaturalperson.name) 放入我的视图中。

所以我写了:

CREATE VIEW `data_entry` AS
SELECT        
    `sites`.`longitude` AS longitude,
    `sites`.`latitude` AS latitude,

    (SELECT `companiesornaturalperson`.`name` 
        FROM  sites sites
        INNER JOIN 
            companiesornaturalperson companiesornaturalperson ON sites.contractor = companiesornaturalperson.idCompaniesOrNaturalPerson
    ) AS contractor_name

FROM sites

当我的站点表中有一行时,这运行良好,但是当我有不止一行时,这会导致我出现“子查询返回超过 1 行”错误。

我明白这是因为我的加入在这些情况下带来了不止一个价值。问题是我不知道如何只返回一个值(某种“WHERE sites.id = 站点的真实 id”)。我搜索了很多次,但仍然无法解决。

【问题讨论】:

如果存在多个承包商,它应该返回什么?您是否只想每经纬度返回 1 个? 每个站点只有一个承包商。 【参考方案1】:

您可以使用相关的子查询来做您想做的事(可能):

CREATE VIEW `data_entry` AS
    SELECT s.`longitude` AS longitude,
           s.`latitude` AS latitude,
           (SELECT cnp.`name` 
            FROM companiesornaturalperson cnp 
            WHERE s.contractor = cnp.idCompaniesOrNaturalPerson
           ) AS contractor_name
    FROM sites s;

如果有多个匹配项,这可能仍会产生错误(不太可能,鉴于列的名称)。

MySQL 不允许在 FROM 子句中使用子查询,但允许标量子查询。

您也可以使用LEFT JOIN

CREATE VIEW `data_entry` AS
    SELECT s.`longitude` AS longitude,
           s.`latitude` AS latitude,
           cnp.`name` as contractor_name
    FROM sites s LEFT JOIN
         companiesornaturalperson cnp 
         ON s.contractor = cnp.idCompaniesOrNaturalPerson;

【讨论】:

我会尝试您的第一个解决方案。我不能做第二个,因为我需要将“companiesornaturalperson”表中的更多列放入 select :一个带有 ON sites.contractor = Companiesornaturalperson.idCompaniesOrNaturalPerson;另一个与 ON sites.landlord = companyornaturalperson.idCompaniesOrNaturalPerson... 好的,第一个解决方案效果很好。谢谢你,救命!【参考方案2】:

你可以试试这个吗?

CREATE VIEW `data_entry` AS
SELECT        
    `sites`.`longitude` AS longitude,
    `sites`.`latitude` AS latitude,
    `companiesornaturalperson`.`name` 
FROM sites    
INNER JOIN 
    companiesornaturalperson ON sites.contractor = companiesornaturalperson.idCompaniesOrNaturalPerson

【讨论】:

是的,但我需要将“companiesornaturalperson”表中的更多列放入选择中:一个带有 ON sites.contractor = Companiesornaturalperson.idCompaniesOrNaturalPerson;另一个与 ON sites.landlord = companyornaturalperson.idCompaniesOrNaturalPerson...

以上是关于Mysql 视图 - 连接中的选择数据返回超过 1 行的主要内容,如果未能解决你的问题,请参考以下文章

如何用mysql workbench导出数据库表中的数据

MySQL:视图与存储过程

MySQL:数据库名称作为视图中的参数

mysql建立索引的一些小规则

为啥 MySql 会出现“子查询返回超过 1 行”错误?

在Intellij IDEA中如何操作MYSQL数据表