2017-08-11 70 views
0

您好我有以下MySQL查询“多行”

SELECT `company`,`type`,`code` FROM `location` WHERE (
SELECT code FROM meter WHERE `meter`.`location_code`=location.code AND meter.code NOT IN (
SELECT meter_code FROM reading 
)) 

MySQL查询我收到一个错误,指出多行返回

我能问为什么/有指导

其他问题还没有真正帮助我说实话

+0

我觉得你的意思是;选择'公司','类型','代码'从'位置'中的代码( 选择代码FROM米WHERE'米'.'位置代码'= location.code AND米。代码NOT IN( SELECT meter_code FROM reading )) Mysql现在期望第一个子查询的结果是true或false,而不是代码集合。 – Dennisvdh

+0

在某个位置可以有1米多的距离吗? – xQbert

+0

@xqbert不。我正在阅读,它应该是理想的内部加入其他答案,但他们似乎都很混乱 – ManMetWebTek

回答

0

我认为你需要使用EXISTS操作:

SELECT `company`,`type`,`code` 
FROM `location` 
WHERE EXISTS (SELECT code 
       FROM meter 
       WHERE `meter`.`location_code` = location.code AND 
        meter.code NOT IN (SELECT meter_code FROM reading)) 
1

因为你不需要从仪表或仪表代码数据

SELECT `company`,`type`,`code` 
FROM `location` 
WHERE EXISTS (SELECT * 
       FROM meter 
       LEFT JOIN Reading R 
       on meter.code = R.meter_Code 
       WHERE `meter`.`location_code`=location.code 
       and R.meter_Code is null 
      ) 

或继续使用存在的主题(这避免了不同性能的影响,避免了连接;但一个不存在可能会很慢。

SELECT `company`,`type`,`code` 
FROM location l 
WHERE EXISTS (SELECT * 
       FROM meter m 
       WHERE m.location_code=l.code 
       and not exists (SELECT * 
           FROM READING r 
           WHERE R.meter_Code = m.Code 

      ) 

这是如何完成与连接,但独特和联接看起来像他们可能是昂贵的。不同的是必要的,因为我认为一个位置可能有很多米,反之亦然,或者一个米可能有很多读数导致数据倍增因此不同;但需要付出代价。

SELECT DISTINCT l.company,l.type,l.code 
FROM location l 
INNER JOIN METER M 
on l.code = m.location_Code 
LEFT JOIN reading R 
on R.Meter_Code = m.Code 
WHERE r.meter_Code is null 

需要测试每一个以找出最适合您的需求的性能。每个表中的记录数量指标和数据分布都可能改变其中每一个的性能。我偏向最后一个,然后从维护角度来看第一个,但它可能是最糟糕的表现。

+0

卡住了一个星期!救主。谢谢。 – ManMetWebTek