外键只从表中选择一条记录

时间:2014-08-12 14:46:35

标签: sql sql-server

我正在使用sql server 2012.我有两个表,M_SALES& M_SALES_COUNTRY。 M_SALES包含一个名为sale_id的主键。 M_SALES_COUNTRY还包含一个名为sale_id的字段,它是外键。 M_SALES_COUNTRY还包含一个名为country_code的字段,该字段可以为null。

所以M_SALES包含一个独特的sale_id。 M_SALES_COUNTRY可以包含多个相同的sale_id。

对于下面的查询,M_SALES_COUNTRY中的1个记录(可能有多个,但我只想要一个)为M_SALES表中的每个sales_id返回,这很好,我想要的。但是我想知道是否可以添加更多条件。

如果M_SALES中的sale_id引用M_SALES_COUNTRY中的多个sale_id,我希望它返回country_code字段不为空的记录。如果所有记录country_code都为null,则返回null。请参阅下面的两个简单示例。

 sale_id     country_code   
 AAA5555     null
 AAA5555     null
 AAA5555     D56
记录我想要的是D56。

下一个例子

 sale_id     country_code   
 AAA5555     null
 AAA5555     null
 AAA5555     null

只要返回一个记录就会在这里做任何记录。

查询

 select M_SALES.*, M_SALES_COUNTRY.*
 from M_SALES cross apply
 (
    select top 1 M_SALES_COUNTRY.*
    from M_SALES_COUNTRY
    where M_SALES.sale_id = M_SALES_COUNTRY.sale_id     
  ) MA_DEALS_COUNTRY
  order by M_SALES.sale_id

1 个答案:

答案 0 :(得分:0)

您可以使用子查询消除重复项并加入该表,即

SELECT *
FROM M_SALES 
JOIN (SELECT sales_id, max(country_code) as country_code
                    FROM M_SALES_COUNTRY GROUP BY sales_id
    ) M_SALES_COUNTRY
ON M_SALES_COUNTRY.sales_id = M_SALES.sales_id

我还会考虑清理M_Sales_Country表,以便sales_id是唯一的,或者创建另一个版本,其中包含销售ID的唯一值。