我有一个名为DefaultCountries
的表。
它包含以下列:
我有29个不同的国家,每个国家都有不同的数据。例如:
CountryID为1有2条记录:
CountryID of 7有3条记录
我有一个表变量@CountryData
,我正在尝试加入,目前有CountryIDs 1和10的数据。
我希望能够匹配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的记录。
答案 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,或者下一个订单号是什么。