要使用哪种SQL func而不是UNION来只有一个条件?

要使用哪种SQL func而不是UNION来只有一个条件?,sql,join,union,Sql,Join,Union,我需要缩短此SQL请求。我要用JOIN吗? UNION之间的一切都是一样的,只是表名不同 UPD:是否可以对所有表只使用一组条件 SELECT column1, column2, column3, COUNT(*) FROM TABLE_1 WHERE (condition1) AND (condition2) GROUP BY column1, column2, column3 UNION ...

我需要缩短此SQL请求。我要用JOIN吗? UNION之间的一切都是一样的,只是表名不同

UPD:是否可以对所有表只使用一组条件

SELECT column1, column2, column3, COUNT(*) FROM TABLE_1 WHERE
(condition1)
AND
(condition2)

GROUP BY column1, column2, column3

UNION

...                                              (N times)

UNION

SELECT column1, column2, column3, COUNT(*) FROM TABLE_N WHERE
(condition1)
AND
(condition2)

GROUP BY column1, column2, column3

ORDER BY column1, column2, column3;

如果您的数据存储在多个这样的表中,您需要在某个时候从所有表中进行选择,从而创建一个这样的长查询。您可以创建一个对所有表进行并集的视图,然后可以从视图中进行选择,因为它是一个对象。差不多

CREATE VIEW all_tables as 
SELECT column1, column2, column3, COUNT(*) FROM TABLE_1 WHERE
(condition1)
AND
(condition2)
GROUP BY column1, column2, column3
UNION
...      

JOIN
UNION
之间的区别在于,如果使用JOIN,则列不会全部在一个表中,每个表都有不同的列,而且数据必须在每个表中的某一列中匹配,我猜这不是您想要的,因为使用了UNION

bjorsig确实建议了一种
视图
方法,在这种方法中,您不必每次都显式地给出所有表来获取这些数据,但如果每次的
N
值都不同,那么这种方法就行不通了

我想建议一个新的方案

下面是一个您可以尝试的快速示例,但是这确实假设您的表名遵循了
表1
表2
等惯例

这在SQL Server中,但在其他技术中应该很容易应用

DECLARE @total_iterations INT = 2;

DECLARE @Select_Query NVARCHAR(MAX) = 'SELECT column1, 
                                                column2, 
                                                column3, 
                                                COUNT(*) ';
DECLARE @Condition NVARCHAR(MAX) = ' WHERE (condition1)
                                       AND (condition2)
                                       GROUP BY column1, column2, column3';

DECLARE @Full_Query NVARCHAR(MAX) = '';
DECLARE @counter INT = 1;                                 
WHILE @counter <= @total_iterations
BEGIN
   SET @Full_Query = (SELECT(@Full_Query + @Select_Query + 'FROM table_' + CAST(@counter AS NVARCHAR)  + @Condition))
   IF(@counter < @total_iterations) BEGIN
        SET @Full_Query = (SELECT(@Full_Query + ' UNION '))
   END;
   SET @counter = @counter + 1;
END;
EXECUTE sp_executesql  @Final_Query;

您的查询可以写为:

SELECT column1, column2, column3, COUNT(*)
FROM ((SELECT column1, column2, column3, 1 as which
       FROM TABLE_1
      ) UNION ALL
      (SELECT column1, column2, column3, 2 as which
       FROM TABLE_2
      ) UNION ALL
      . . .
     ) t
WHERE (condition1) AND
      (condition2)
GROUP BY column1, column2, column3, which;

这完全取决于表和查询。@Alexandri。我认为您的数据模型有问题。在我看来,所有数据都应该存储在一个表中。这将简化您的查询。此外,我真诚地怀疑您是否想要
联合
,因为这样可以删除重复项,这在处理计数时似乎不太可能。@GordonLinoff,这是无可争议的,因为它是我研究工作的框架的数据模型。非常感谢。工会更好:)谢谢你的快速反应。是的,它存储在许多表中,并且条件集是相同的。有可能让所有的桌子都有一个吗?我曾想过使用JOIN,但我担心请求会太复杂。JOIN会给您提供不同的数据集,这意味着您可以获得column1、column2、column3、CouncFromTBL1、countFromTbl2、countFromTbl3等。但您仍然需要使用SQL来加入它们。这正是我所需要的。谢谢谢谢实际上,
N
是常量,但对于我这个SQL新手来说,它是一个有用的示例。
SELECT column1, column2, column3, COUNT(*)
FROM ((SELECT column1, column2, column3, 1 as which
       FROM TABLE_1
      ) UNION ALL
      (SELECT column1, column2, column3, 2 as which
       FROM TABLE_2
      ) UNION ALL
      . . .
     ) t
WHERE (condition1) AND
      (condition2)
GROUP BY column1, column2, column3, which;