尝试根据连接查找记录

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,其中:

  1. Table_1 和 Tbl_Lookup 在 Num1
  2. 上匹配

  1. 如果 Table_1 中的特定 Num1 有超过 1 条记录,则只有 return Table_1.Code1=[=51 的行=].Code1

  2. 否则,如果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;