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 行的主要内容,如果未能解决你的问题,请参考以下文章