2

考虑以下现实场景:

您有一个城镇表,但想要查找这些城镇各自的邮政编码。在大多数情况下,这很容易做到,因为每个城镇只有一个邮政编码,但在处理城市时确实存在例外情况。

你有两张桌子:

CONTACT
Town          | Zip
--------------+----
Ft Washington | NULL
Ambler        | NULL
Media         | NULL
Ambler        | NULL
New York      | NULL

CITIES_EXTENDED
Town          | Zip
--------------+----
Ft Washington | 19034
Ambler        | 19002
Media         | 19063
New York      | 10101
New York      | 10102
New York      | 10103
New York      | 10104

INNER JOIN返回四行New York。这显然是不可取的,因为该数据本质上是不准确的。

期望的结果如下:

Town          | Zip
--------------+----
Ft Washington | 19034
Ambler        | 19002
Media         | 19063
Ambler        | 19002
New York      | NULL

实现这一目标的最佳方法是什么?

4

2 回答 2

3

这能解决你的问题吗?

select ce.Town, 
case when count(*) > 1 then null else Max(c.Zip) end as Zip
from CITIES_EXTENDED ce
    inner join CONTACT c
        on ce.Town = c.Town
    group by ce.Town

Max() 函数可以正常工作,因为 c.Zip 只有一个值。

于 2013-06-13T15:10:28.213 回答
1

尝试:

Select  a.Town,
        b.zip
FROM    contact a
INNER JOIN cities_extended b ON a.Town = b.Town
WHERE a.Town NOT IN (
    SELECT  Town
    FROM    (
        Select  Town,
                COUNT(*)
        From    cities_extended
        Group by Town
        HAVING COUNT(*) > 1
    ) T
)

UNION ALL 

Select  DISTINCT
        a.Town,
        NULL
FROM    contact a
INNER JOIN  cities_extended b ON a.Town = b.Town
WHERE   a.Town IN (
    SELECT  Town
    FROM    (
        Select  Town,
                COUNT(*)
        From    cities_extended
        Group by Town
        HAVING COUNT(*) > 1
    ) T
)

看我的演示

这可能不是一个优雅的解决方案,但这可以根据您的要求完成工作;-)

于 2013-06-13T15:11:31.427 回答