SQL查询帮助处理非唯一重复项

And*_*ans 5 sql

我想不通过这个.我有这个问题:

SELECT 
    p.person_id,
    p.first_nm,
    p.last_nm, 
    pu.purchase_dt,
    pr.sku, 
    pr.description,
    a.address_type_id,
    a.city_cd, 
    a.state_cd, 
    a.postal_cd
FROM 
    person p 
    INNER JOIN address a ON p.person_id = a.person_id
    INNER JOIN purchase pu ON pu.person_id = p.person_id
    INNER JOIN product pr ON pr.product_id = pu.product_id
Run Code Online (Sandbox Code Playgroud)

很简单 - 我只需要为我们发货的客户获取信息.但是,由于addressType表

AddressType

address_type_id    address_type_desc
------------------------------------
1            Home
2            Shipping
Run Code Online (Sandbox Code Playgroud)

一些客户在地址表中有多个地址,创建这样的非唯一重复条目.

1,Smith, John, 12/01/2009, A12345, Purple Widget, 1, Anywhere, CA, 12345
1,Smith, John, 12/01/2009, A12345, Purple Widget, 2, Somewhere, ID, 54321
Run Code Online (Sandbox Code Playgroud)

我想让查询返回一行/人并返回家庭地址(如果可用),返回送货地址.

这看起来很简单,也许这只是我的感冒,但这让我有点头疼.

Bet*_*eth 6

你想改变你的连接,所以它返回min(addressID)而不是所有的连接:

        INNER JOIN address a ON p.person_id = a.person_id
        inner join (select person_id, min(address_type_id) as min_addr 
from address group by person_id) a_min 
on a.person_id = a_min.person_id and a.address_type_id = a_min.min_addr
Run Code Online (Sandbox Code Playgroud)


Joe*_*lli 5

SELECT 
    p.person_id,
    p.first_nm,
    p.last_nm, 
    pu.purchase_dt,
    pr.sku, 
    pr.description,
    COALESCE(ha.address_type_id, sa.address_type_id) AS address_type_id
    CASE WHEN ha.address_type_id IS NOT NULL THEN ha.city_cd ELSE sa.city_cd END AS city_cd, 
    CASE WHEN ha.address_type_id IS NOT NULL THEN ha.state_cd ELSE sa.state_cd END AS state_cd, 
    CASE WHEN ha.address_type_id IS NOT NULL THEN ha.postal_cd ELSE sa.postal_cd END AS postal_cd
FROM 
    person p 
    LEFT JOIN address ha ON p.person_id = ha.person_id AND ha.address_type_id = 1
    LEFT JOIN address sa ON p.person_id = sa.person_id AND sa.address_type_id = 2
    INNER JOIN purchase pu ON pu.person_id = p.person_id
    INNER JOIN product pr ON pr.product_id = pu.product_id
Run Code Online (Sandbox Code Playgroud)