尝试根据连接查找记录
Trying to look up records based on a join
我正在尝试处理一个有点棘手的存储过程,假设我有 Table_1
数据:
Num1 Name1 Code1 Desc
-------------------------------------------
123B Apple 10 Text1
123B Apple 11 Text1
123C Google 20 Text2
我也有一个查找 table 看起来像这样:
Tbl_LookUp
Num1 Code1
-------------------
123B 10
123C 25
所以我在这种情况下尝试做的是:
Select 数据来自 Table_1,其中:
- Table_1 和 Tbl_Lookup 在 Num1
上匹配
和
如果 Table_1 中的特定 Num1 有超过 1 条记录,则只有 return Table_1.Code1=[=51 的行=].Code1
否则,如果Table_1中的特定Num1只有1条记录,那么即使Table_1.Code1 = Tbl_Lookup.Code1没有工作,还是return记录。
期望的最终结果:
Num1 Name1 Code1 Desc
--------------------------------------------
123B Apple 10 Text1
123C Google 20 Text2
123B 被 returned 因为这个 Num1 有多个记录。其中一个有对应于Tbl_Lookup.Code1
的Code1
123C是returned,因为虽然Code1不匹配Tbl_Lookup,但是只有一条记录,所以join无所谓,我们还是要return它。
非常感谢任何帮助。
不确定是否有更好的方法。但这应该会给你想要的东西
select t.*
from table1 t
join Tbl_LookUp l on l.Num1 = t.Num1
where t.code1 = l.code1
or exists ( select count(1) from table1 i
where i.Num1= t.Num1
group by Num1
having count(Num1) = 1 )
一种方法是
select t.Num1, t.Name1, t.Code1, t.Desc
from (
select Num1, Name1, Code1, Desc,
count(code1) over(partition by Num1) cnt
from Table_1 ) t
join Tbl_Lookup tl on t.Num1 = tl.Num1
and (t.cnt = 1 or t.Code1 = tl.Code1)
这是一个很好用的地方apply
:
select t1.*
from tbl_lookup l cross apply
(select top (1) t1.*
from table1 t1
where t1.num1 = l.num1
order by (case when t.code = l.code1 then 1 else 2 end)
);
另一种获得所需结果的方法 - 确定与 exists
的精确查找匹配并计算 num1
的出现次数,然后允许任何计数为 1 或仅在两列上匹配更多比 1:
select num1, name1, code1, [desc]
from (
select * , case when exists (select * from [lookup] l where l.num1 = t.num1 and l.code1 = t.code1) then 1 end lmatch, Count(*) over (partition by num1) cnt
from t1 t
where exists (select * from [lookup] l where l.num1 = t.num1)
)x
where lmatch = 1 and cnt > 1 or cnt = 1;
我正在尝试处理一个有点棘手的存储过程,假设我有 Table_1
数据:
Num1 Name1 Code1 Desc
-------------------------------------------
123B Apple 10 Text1
123B Apple 11 Text1
123C Google 20 Text2
我也有一个查找 table 看起来像这样:
Tbl_LookUp
Num1 Code1
-------------------
123B 10
123C 25
所以我在这种情况下尝试做的是:
Select 数据来自 Table_1,其中:
- Table_1 和 Tbl_Lookup 在 Num1 上匹配
和
如果 Table_1 中的特定 Num1 有超过 1 条记录,则只有 return Table_1.Code1=[=51 的行=].Code1
否则,如果Table_1中的特定Num1只有1条记录,那么即使Table_1.Code1 = Tbl_Lookup.Code1没有工作,还是return记录。
期望的最终结果:
Num1 Name1 Code1 Desc
--------------------------------------------
123B Apple 10 Text1
123C Google 20 Text2
123B 被 returned 因为这个 Num1 有多个记录。其中一个有对应于Tbl_Lookup.Code1
的Code1123C是returned,因为虽然Code1不匹配Tbl_Lookup,但是只有一条记录,所以join无所谓,我们还是要return它。
非常感谢任何帮助。
不确定是否有更好的方法。但这应该会给你想要的东西
select t.*
from table1 t
join Tbl_LookUp l on l.Num1 = t.Num1
where t.code1 = l.code1
or exists ( select count(1) from table1 i
where i.Num1= t.Num1
group by Num1
having count(Num1) = 1 )
一种方法是
select t.Num1, t.Name1, t.Code1, t.Desc
from (
select Num1, Name1, Code1, Desc,
count(code1) over(partition by Num1) cnt
from Table_1 ) t
join Tbl_Lookup tl on t.Num1 = tl.Num1
and (t.cnt = 1 or t.Code1 = tl.Code1)
这是一个很好用的地方apply
:
select t1.*
from tbl_lookup l cross apply
(select top (1) t1.*
from table1 t1
where t1.num1 = l.num1
order by (case when t.code = l.code1 then 1 else 2 end)
);
另一种获得所需结果的方法 - 确定与 exists
的精确查找匹配并计算 num1
的出现次数,然后允许任何计数为 1 或仅在两列上匹配更多比 1:
select num1, name1, code1, [desc]
from (
select * , case when exists (select * from [lookup] l where l.num1 = t.num1 and l.code1 = t.code1) then 1 end lmatch, Count(*) over (partition by num1) cnt
from t1 t
where exists (select * from [lookup] l where l.num1 = t.num1)
)x
where lmatch = 1 and cnt > 1 or cnt = 1;