查询以获取依赖于另一列的数据,但仅当它出现一次时

时间:2013-01-30 15:13:19

标签: mysql select

我有一个类似于以下内容的MySQL表:

+--------------------------------------------+
|  ID  |  State   |  Name   |     City       |
+--------------------------------------------+
|  PA1 |  PA      |  Foo    |    Philly      |
|  VA1 |  PA      |  Foo    |    Philly      |
|  DC1 |  VA      |  Foobar |  Washington    |
|  ME2 |  ME      |  Barfoo |   Portland     |
+--------------------------------------------+

现在,我想做一个SELECT语句,其中我只选择那些State = SUBSTR(ID, 1, 2)的行,除非<{em} Name只出现在表中一次。换句话说,我想最终得到下表:

+--------------------------------------------+
|  ID  |  State   |  Name   |     City       |
+--------------------------------------------+
|  PA1 |  PA      |  Foo    |    Philly      |
|  DC1 |  VA      |  Foobar |  Washington    |
|  ME2 |  ME      |  Barfoo |   Portland     |
+--------------------------------------------+

在第二行中,State不等于ID的子字符串,并且“Name”(在此示例中为“Foo”)不止一次出现在表中,因此我们不会获得该行。但是,我也想要第三行,即使State再次不等于ID的子字符串,因为'Name'只在原始表中出现一次。

关于我可以用什么查询来实现这一点的任何想法?我已经玩了很长时间没有成功。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以在EXISTS子句中使用以下WHERE

select *
from yourtable t1
where state = SUBSTR(ID, 1, 2)
  or exists (select count(Name) CountName, Name
              from yourtable t2
              where t1.name = t2.name
              group by Name
              having count(name) = 1)

请参阅SQL Fiddle with Demo

返回结果:

|  ID | STATE |   NAME |       CITY |
-------------------------------------
| PA1 |    PA |    Foo |     Philly |
| DC1 |    VA | Foobar | Washington |
| ME2 |    ME | Barfoo |   Portland |

答案 1 :(得分:2)

select *
from   myTable
where  State = SUBSTR(ID, 1, 2) or
       Name in (select Name from myTable group by Name having count(*)=1)