【问题标题】:Select count(*) from table where (multiple id) in (table)从表中选择 count(*) where (multiple id) in (table)
【发布时间】:2017-09-15 16:04:38
【问题描述】:

有没有办法写

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)

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

有人吗?

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

【问题讨论】:

  • 你不能使用 JOIN 吗?
  • 当然。如果这样会更好。
  • 您能详细说明您面临的问题吗?当然你可以写3种不同的语句
  • 那个查询要么返回 0,要么返回表中的行数……没有多大意义。

标签: sql sql-server tsql


【解决方案1】:

具有三个ins 的版本可能是最有效的方法。如果你想尝试比较,可以使用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 一个列。这种格式也可以简化这种类型的查询。

【讨论】:

  • id 是一个表的相同列,但是是不同的项目。 IE。 Person1、SisterofPerson、Brother 等。但他们在同一个 Person 表上
  • 如果我想使用计数怎么办?我会更新问题。
  • 如果有人有两个姐妹怎么办?关系表更有意义。
  • 有一个关系表。并且拥有多个姐妹处理得很好。 (虽然Persons 只是一个例子)
【解决方案2】:

关于获取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

【讨论】:

    【解决方案3】:

    我不确定我是否理解您的问题,您能否举例说明您正在使用的数据和结果。

    据我了解,您可以使用这样的 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
    

    它会给你这样的结果。你将不得不改变周围的列。

    【讨论】:

      猜你喜欢
      • 2018-11-14
      • 1970-01-01
      • 2021-09-08
      • 2023-03-19
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多