2017-10-13 27 views
0

问题是'列出所有不具有metertype属性的高级“ 已安装的pid。在答案中使用子查询。我的查询需要稍微更具体

METERTYPEPROPERTYMETER

这是我想出了

SELECT PROPERTYMETER.pid, METERTYPE.description 
FROM PROPERTYMETER , METERTYPE 
WHERE PROPERTYMETER.metertype = METERTYPE.metertype 
    AND description IN (SELECT description FROM METERTYPE WHERE description = 'conventional') 

这将查询的结果我得到

enter image description here

结果是一个事实,即所有的好一边PID 9具有常规和高级的类型,所以我没有真正正确回答这个问题。我可以做什么我的查询,以确保只返回的PID有metertype常规?

+0

将您的代码发布为纯文本而不是图片。有关代码格式帮助,请参阅https://stackoverflow.com/help/formatting。 – Barmar

+0

获取所有具有'metertype = advanced'的属性的'pid'。然后用'NOT IN'测试排除它们。 – Barmar

+0

做到了这一点,它的工作完美,谢谢! – kr1s

回答

0

使用子查询获取metertype = 'advanced'的所有属性中的pid。然后使用NOT IN将它们排除在最终结果之外。

SELECT DISTINCT pid 
FROM propertymeter 
WHERE pid NOT IN (
    SELECT pid 
    FROM propertymeter AS p 
    JOIN metertype AS m ON p.metertype = m.metertype 
    WHERE m.description = 'advanced') 
+0

这也工作得很好,是否有任何理由使用连接而不是多个子查询?我瘦我读的地方,连接提供更好的性能,或更有效率或什么 – kr1s

+0

是的,MySQL并不总是优化'WHERE IN(子查询)'很好。上面的'NOT IN'也可以写成'LEFT JOIN/NULL'模式,参见https://stackoverflow.com/questions/21633115/return-row-only-if-value-doesnt-exist?lq=1 – Barmar