条件可以在T-SQL查询中重复使用吗?

条件可以在T-SQL查询中重复使用吗?,sql,tsql,Sql,Tsql,我有一个SQL查询,如下所示: SELECT o.name, o.type_id, (SELECT COUNT(*) FROM a WHERE type_id = o.type_id AND id IN ('1, 2, 3 ... 1000')) AS count_a, (SELECT COUNT(*) FROM b WHERE type_id = o.type_id AND id IN ('1, 2, 3 ... 1000')) AS count_b,

我有一个SQL查询,如下所示:

SELECT
    o.name,
    o.type_id, 
    (SELECT COUNT(*) FROM a WHERE type_id = o.type_id AND id IN ('1, 2, 3 ... 1000')) AS count_a, 
    (SELECT COUNT(*) FROM b WHERE type_id = o.type_id AND id IN ('1, 2, 3 ... 1000')) AS count_b, 
    (SELECT COUNT(*) FROM c WHERE type_id = o.type_id AND id IN ('1, 2, 3 ... 1000')) AS count_c
FROM o
在子查询(count_a、count_b和count_c)中,In子句中指定的条件对于每个子查询都是相同的,但是这是一个非常长的数字列表(实际上不是顺序的),我担心:

a)我把查询弄得太长了,这会减慢查询速度
b) 时间太长,最终会导致错误

是否有办法别名/引用该条件列表(可能作为变量?),以便在查询中出现的三个位置中的每一个位置都可以重复使用?还是我无忧无虑

更新

考虑到使用CTE的建议,我已将上面的查询更改为目前的工作方式:

WITH id_list AS (SELECT id FROM source WHERE id IN ('1, 2, 3 ... 1000'))
SELECT
    o.name,
    o.type_id, 
    (SELECT COUNT(*) FROM a WHERE type_id = o.type_id AND id IN (SELECT id FROM id_list)) AS count_a, 
    (SELECT COUNT(*) FROM b WHERE type_id = o.type_id AND id IN (SELECT id FROM id_list)) AS count_b, 
    (SELECT COUNT(*) FROM c WHERE type_id = o.type_id AND id IN (SELECT id FROM id_list)) AS count_c
FROM o
这将查询的总长度减少到原来的三分之一左右,尽管数据库执行查询似乎需要几毫秒的时间,但至少我不会因为查询的长度太长而出错


问题:有没有一种快速方法可以将逗号分隔的数字列表(1、2、3…1000)分解成一个可以用作CTE的结果集?

您可以使用公共表表达式(CTE):


可以使用公共表表达式(CTE):


可以使用公共表表达式(CTE):


可以使用公共表表达式(CTE):


如果您的ID是其他表中的外键,那么您可以从列表中创建一个表变量,然后重复加入该表

DECLARE @id_list TABLE (
  id INT
)

INSERT INTO @id_list
SELECT id
FROM pk_location
WHERE id IN ('1, 2, 3 ... 1000')

SELECT
    o.name,
    o.type_id, 
    (SELECT COUNT(*) FROM a INNER JOIN @id_list i ON a.id = i.id WHERE type_id = o.type_id) AS count_a, 
    (SELECT COUNT(*) FROM b INNER JOIN @id_list i ON b.id = i.id WHERE type_id = o.type_id) AS count_b, 
    (SELECT COUNT(*) FROM c INNER JOIN @id_list i ON c.id = i.id WHERE type_id = o.type_id) AS count_c
FROM o

如果您的ID是其他表中的外键,那么您可以从列表中创建一个表变量,然后重复加入该表

DECLARE @id_list TABLE (
  id INT
)

INSERT INTO @id_list
SELECT id
FROM pk_location
WHERE id IN ('1, 2, 3 ... 1000')

SELECT
    o.name,
    o.type_id, 
    (SELECT COUNT(*) FROM a INNER JOIN @id_list i ON a.id = i.id WHERE type_id = o.type_id) AS count_a, 
    (SELECT COUNT(*) FROM b INNER JOIN @id_list i ON b.id = i.id WHERE type_id = o.type_id) AS count_b, 
    (SELECT COUNT(*) FROM c INNER JOIN @id_list i ON c.id = i.id WHERE type_id = o.type_id) AS count_c
FROM o

如果您的ID是其他表中的外键,那么您可以从列表中创建一个表变量,然后重复加入该表

DECLARE @id_list TABLE (
  id INT
)

INSERT INTO @id_list
SELECT id
FROM pk_location
WHERE id IN ('1, 2, 3 ... 1000')

SELECT
    o.name,
    o.type_id, 
    (SELECT COUNT(*) FROM a INNER JOIN @id_list i ON a.id = i.id WHERE type_id = o.type_id) AS count_a, 
    (SELECT COUNT(*) FROM b INNER JOIN @id_list i ON b.id = i.id WHERE type_id = o.type_id) AS count_b, 
    (SELECT COUNT(*) FROM c INNER JOIN @id_list i ON c.id = i.id WHERE type_id = o.type_id) AS count_c
FROM o

如果您的ID是其他表中的外键,那么您可以从列表中创建一个表变量,然后重复加入该表

DECLARE @id_list TABLE (
  id INT
)

INSERT INTO @id_list
SELECT id
FROM pk_location
WHERE id IN ('1, 2, 3 ... 1000')

SELECT
    o.name,
    o.type_id, 
    (SELECT COUNT(*) FROM a INNER JOIN @id_list i ON a.id = i.id WHERE type_id = o.type_id) AS count_a, 
    (SELECT COUNT(*) FROM b INNER JOIN @id_list i ON b.id = i.id WHERE type_id = o.type_id) AS count_b, 
    (SELECT COUNT(*) FROM c INNER JOIN @id_list i ON c.id = i.id WHERE type_id = o.type_id) AS count_c
FROM o


对您可以使用with关键字。这也称为公共表表达式。字符串解析是一个古老的主题。搜索“sql字符串解析”,您将找到几十个答案。您最近添加的第二个问题的答案取决于sql-server的版本。是。您可以使用with关键字。这也称为公共表表达式。字符串解析是一个古老的主题。搜索“sql字符串解析”,您将找到几十个答案。您最近添加的第二个问题的答案取决于sql-server的版本。是。您可以使用with关键字。这也称为公共表表达式。字符串解析是一个古老的主题。搜索“sql字符串解析”,您将找到几十个答案。您最近添加的第二个问题的答案取决于sql-server的版本。是。您可以使用with关键字。这也称为公共表表达式。字符串解析是一个古老的主题。搜索“sql字符串解析”,你会找到几十个答案。你最近添加的第二个问题的答案取决于sql-server的版本。谢谢Tim,我用你的建议更新了我的问题,如果你不介意的话,还添加了一个问题:)@Jimbo:你的最后一个问题取决于sql-server的版本,您可以在所有版本中使用此方法:但是,下面是所有版本的所有方法的完整概述,值得一读:谢谢Tim,我用您的建议更新了我的问题,如果您不介意的话,还添加了一个问题:)@Jimbo:您的最后一个问题取决于sql server的版本,您可以在所有版本中使用此方法:但是,下面是所有版本的所有方法的完整概述,值得一读:谢谢Tim,我用您的建议更新了我的问题,如果您不介意的话,还添加了一个问题:)@Jimbo:您的最后一个问题取决于sql server的版本,您可以在所有版本中使用此方法:但是,下面是所有版本的所有方法的完整概述,值得一读:谢谢Tim,我用您的建议更新了我的问题,如果您不介意的话,还添加了一个问题:)@Jimbo:您的最后一个问题取决于sql server的版本,您可以在所有版本中使用此方法:但是,以下是所有版本的所有方法的完整概述,值得一读: