跨两个表和列的带有“IN”子句的 Sql Query

Posted

技术标签:

【中文标题】跨两个表和列的带有“IN”子句的 Sql Query【英文标题】:Sql Query with "IN" clause across two tables and columns 【发布时间】:2017-03-01 07:20:15 【问题描述】:

表 1

 Id | Mapping_Id (INT)
 --- ---------------
  1    1001
  2    1002
  3    1003
  4    1004

表2

 Name | ResultId (nvarchar(Max))
 ----  -------------------------
  AB    1001,1002,1003,1004

现在,我需要通过在 Mapping_IdResultId 列上使用 Table1Table2 来提供来自 Table1 的 Id 总和的查询

即:类似于 Select sum(A.Id),B.Name from Table1 A,Table2 B where A.Mapping_Id in (B.ResultId)

预期结果:

 Count | ResultId (nvarchar(Max))
 -----  -------------------------
  10       AB

【问题讨论】:

如果我可以问,为什么你需要一个 id 字段的总和? 不要将列值存储为逗号分隔 或者代替 ID,我可能有一些与这些 ID 相对应的价格......@Nico Van Belle 是其他函数的结果集,应该是这样的......@Ullas @Ullas 永远不要说永远。 【参考方案1】:

试试这个查询:

SELECT SUM(Table1.id), Table2.Name
from Table1
join Table2 on CHARINDEX(cast(Table1.Mapping_id as varchar), Table2.ResultID)>0
group by Table2.Name

【讨论】:

例子:如果mapping_id = '1', and resultId = '1001' => 查询结果会出错【参考方案2】:

试试这个...

Select sum(A.Id),B.Name from Table1 A,Table2 B where A.Mapping_Id in (select value from SplitDelimited(B.ResultId,','))

为此使用 SplitDelimited 函数..

ALTER FUNCTION [dbo].[SplitDelimited]
(   
    @List nvarchar(MAX),
    @SplitOn nvarchar(1)
)
RETURNS @RtnValue table (
    Id int identity(1,1),
    Value nvarchar(MAX)
)

AS
BEGIN
    While (Charindex(@SplitOn,@List)>0)
    Begin 
        if(len(@List) > 0)
        begin
            Insert Into @RtnValue (value)
            Select 
                Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
            Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List))
        end
    End 

    Insert Into @RtnValue (Value)
    Select Value = ltrim(rtrim(@List))

    Return
END

【讨论】:

以上是关于跨两个表和列的带有“IN”子句的 Sql Query的主要内容,如果未能解决你的问题,请参考以下文章

带有两个日期列的 sql 查询“where 子句”

无法在具有聚合值的 HAVING 子句中使用来自子查询表连接的单值列

将带有html标签的列值转换为带有行和列的sql视图

MySQL 表和列的注释

如何正确使用带有 COUNT 列的 SQL HAVING 子句?

oracle查看表和列的描述