这个问题本身很简单,但是我无法在一个查询中找到解决方案,这是我对问题的“抽象”,以便给出更简单的解释:
我将保留原先的解释,但这是一组示例数据和预期的结果:
好的,这是一些示例数据,我用空行分隔成对
@H_404_8@-------------
| Key | Col | (Together they from a Unique Pair)
--------------
| 1 Foo |
| 1 Bar |
| |
| 2 Foo |
| |
| 3 Bar |
| |
| 4 Foo |
| 4 Bar |
--------------
我期望的结果是,在运行一次查询后,需要能够在一个查询中选择此结果集:
@H_404_8@1 - Foo
2 - Foo
3 - Bar
4 - Foo
原始说明:
我有一个表,将其称为TABLE,其中有两列,分别是ID和NAME,它们共同构成了表的主键.现在,我想选择ID = 1的对象,然后首先检查它是否可以找到NAME为“ John”值的行,如果“ John”不存在,则应查找NAME为“ Bruce”的行-但是仅当同时存在“ Bruce”和“ John”或仅存在“ John”时,才返回“ John”.
还要注意,它应该能够为每个查询返回多行,这些行与上述条件匹配,但ID /名称组合当然不同,并且上述说明只是对实际问题的简化.
我可能对自己的代码和思路完全不了解,但是我无法弄清楚.
解决方法:
这与您编写的内容非常相似,但是应该相当快,因为在这种情况下,NOT EXISTS比NOT IN更加有效…
@H_404_8@MysqL> select * from foo;
+----+-----+
| id | col |
+----+-----+
| 1 | Bar |
| 1 | Foo |
| 2 | Foo |
| 3 | Bar |
| 4 | Bar |
| 4 | Foo |
+----+-----+
SELECT id
, col
FROM foo f1
WHERE col = 'Foo'
OR ( col = 'Bar' AND NOT EXISTS( SELECT *
FROM foo f2
WHERE f1.id = f2.id
AND f2.col = 'Foo'
)
);
+----+-----+
| id | col |
+----+-----+
| 1 | Foo |
| 2 | Foo |
| 3 | Bar |
| 4 | Foo |
+----+-----+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。