-1

次のようなMySQLテーブルがあります。

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

ここで、 がテーブルに一度だけ表示されない限りState = SUBSTR(ID, 1, 2)、の行のみを SELECT する SELECT ステートメントを実行したいと考えています。言い換えれば、次の表で終わりたいと思います。Name

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

2 行目では、State が ID の部分文字列と等しくなく、その 'Name' (この例では「Foo」) がテーブルに複数回出現するため、その行は取得されません。ただし、State が ID の部分文字列と等しくなくても、3 行目も必要です。これは、その「名前」が元のテーブルに 1 回しか表示されないためです。

これを達成するためにどのクエリを使用できるかについてのアイデアはありますか? 私は成功せずにかなり長い間それをいじっていました。ありがとう!

4

2 に答える 2

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 FiddlewithDemoを参照してください

結果を返します:

|  ID | STATE |   NAME |       CITY |
-------------------------------------
| PA1 |    PA |    Foo |     Philly |
| DC1 |    VA | Foobar | Washington |
| ME2 |    ME | Barfoo |   Portland |
于 2013-01-30T15:22:44.997 に答える
2
select *
from   myTable
where  State = SUBSTR(ID, 1, 2) or
       Name in (select Name from myTable group by Name having count(*)=1)
于 2013-01-30T15:18:10.277 に答える