从(表)中的(多个id)表中选择count(*)

时间:2017-04-19 12:16:41

标签: sql sql-server tsql

有没有办法写

SELECT count(*) from tablename where (multiple_ids_here) in (SELECT id from tablename)

通常,我会写:

select count(*) from tablename 
where id_1 in (SELECT id from tablename)
OR id_2 in (SELECT id from tablename)
id_3 in (SELECT id from tablename)

如果我们有多个值,效率非常低。

任何?

编辑:问题已更新。如果我想选择计数怎么办?

3 个答案:

答案 0 :(得分:2)

您的三个in版本可能是最有效的方法。如果您想要进行比较,可以使用exists

select . . .
from t t1
where exists (select 1
              from tablename t2
              where t2.id in (t1.id_1, t1.id_2, t1.id_3)
             );

我还应该注意,在这样的多列中存储id通常是数据模型问题的标志。您可能想要一个每个id有一行的表,而不是每个id一列。这种格式也可以简化这种类型的查询。

答案 1 :(得分:0)

我不确定我是否理解您的问题,您可以举例说明您正在使用的数据以及即将发布的数据。

根据我的理解,你可以使用这样的cte。

;WITH Sales_CTE ([counts],CustomerID, SalespersonPersonID,PickedByPersonID)
AS
(
   select count(*),CustomerID,SalespersonPersonID ,PickedByPersonID 
   from [WideWorldImporters].[Sales].[Orders]
   group by CustomerID,SalespersonPersonID,PickedByPersonID
)
SELECT sum([counts])
FROM Sales_CTE
GO

它会给你一个像这样的结果。你必须改变周围的列。

enter image description here

答案 2 :(得分:0)

有关获取count(*)的最新问题...使用cross apply()values()合并common table expression中的数据:

;with cte as (
  select t.Id, v.RelatedId
  from t
    cross apply (values (id_1),(id_2),(id_3)) v(RelatedId)
)

select 
    cte.Id
  , RelationCount = count(*)
from cte
  inner join RelatedTable r
    on cte.RelatedId = r.Id
group by cte.Id