小编典典

在两种可能性中选择唯一的行

sql

这个问题本身很简单,但是我无法在一个查询中找到解决问题的方法,这是我对该问题的“抽象”,以便给出更简单的解释:

我将保留原先的解释,但这是一组示例数据和预期的结果:

好的,这是一些示例数据,我用空行分隔成对

-------------
| Key |  Col | (Together they from a Unique Pair)
--------------
|  1     Foo |
|  1     Bar |
|            |
|  2     Foo |
|            |
|  3     Bar |
|            |
|  4     Foo |
|  4     Bar |
--------------

我期望的结果是, 在运行一次查询后 ,需要能够在一个查询中选择此结果集:

1 - Foo
2 - Foo
3 - Bar
4 - Foo

原始说明:

我有一个表,把它TABLE在那里我有一个两列说ID,并NAME共同构成表的主键。现在,我想选择某处,ID=1然后首先检查它是否可以找到NAME具有“
John”值的行,如果“ John”不存在,则应查找NAME“ Bruce”的行,而仅返回“
John”如果同时存在“布鲁斯”和“约翰”,或者仅存在“约翰”。

还应注意,它应该能够为每个查询返回多行,这些行与上述条件匹配,但ID /名称组合当然不同,并且上述说明只是对实际问题的简化。

我可能对自己的代码和思路完全不了解,但我无法弄清楚。


阅读 209

收藏
2021-04-14

共1个答案

小编典典

这与您写的内容非常相似,但是应该相当快,因为​​在这种情况下,NOT EXISTS比NOT IN更有效…

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 | 
+----+-----+
2021-04-14