我有一个类似于以下内容的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'只在原始表中出现一次。
关于我可以用什么查询来实现这一点的任何想法?我已经玩了很长时间没有成功。谢谢!
答案 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)
返回结果:
| 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)