动态SQL Case语句?

时间:2016-12-13 20:11:12

标签: sql sql-server

我有一个名为DefaultCountries的表。

它包含以下列:

  • CountryID INT
  • DefaultCountryID INT
  • CountryRank INT

我有29个不同的国家,每个国家都有不同的数据。例如:

CountryID为1有2条记录:

CountryID1

CountryID of 7有3条记录

CountryID7

我有一个表变量@CountryData,我正在尝试加入,目前有CountryIDs 1和10的数据。

Example Table

我希望能够匹配DefaultCountryID表中找到的DefaultCountries。因此,如果我传入CountryID = 1,我可以执行以下操作:

SELECT TOP 1 DefaultCountryID 
WHERE CountryID = 1     -- that is my simple case.  

我遇到问题的地方是超过2行。就像我在CountryID = 7的例子中一样。基本上我想要有一些东西,如果我的表中没有记录我正试图加入第一条记录(CountryRank = 1),那么我希望它能够搜索下一条记录。

搜索CountryID = 7,然后搜索,然后CountryID = 10(等等)。

我尝试了此LEFT JOIN的不同变体

SELECT * 
FROM @CountryData cd
LEFT JOIN DefaultCountries dc ON dc.defaultCountryid = cd.CountryID
                              AND cd.CountryID = 7

但这只会带回所有数据(1& 10)。我是否必须使用循环来按照我描述的方式执行此操作?我也考虑过一个CASE声明,但由于DefaultCountries表中我可以有超过2个,我不知道如何继续搜索。

我尝试做一个IN声明,但我有2个问题。我无法在IN语句中执行命令,因为我收到以下消息:

  

ORDER BY子句在视图,内联函数中派生无效   表,子查询和公用表表达式,除非TOP,OFFSET   或者也指定了FOR XML。

即使有办法确保我按照我想要的顺序搜索IN语句,我想确保它在找到的第一个上停止搜索。因此,为了扩展我的示例,如果table(@CountryData)表现在包含CountryID = 7和CountryID = 10的记录,我只想返回CountryID = 7的记录。

1 个答案:

答案 0 :(得分:1)

如果我跟着你,你可以使用CTE

with cte as(
select
    CountryID,
    DefaulteCountryID,
    ROW_NUMBER() over (partition by CountryID order by CountryRank) as rn
from DefaultCountries
where DefaultCountryID in (select distinct CountryID from @CountryData))

然后加入此cte where rn = 1

所以这会满足“基本上我想要有一些东西,如果我的表中没有记录我试图加入第一条记录(CountryRank = 1)那么我希望它能够搜索下一条记录记录“意思是如果没有1你得到2,或3,或者下一个订单号是什么。