使用什么 SQL 函数来代替 UNION 只有一个条件?

What SQL func to use instead of UNION to have only one condition?

我需要缩短此 SQL 请求。我应该使用 JOIN 吗? UNION 之间的一切都是一样的,但是 table 个名称。

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

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;

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

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

JOINUNION 之间的区别在于,如果您使用联接,您的列将不会全部集中在一起,每个 table 会有不同的列而且数据必须在每个 table 的特定列中匹配,我猜这不是你想要的,因为使用了联合。

bjorsig 确实建议了一种 VIEW 方法,在这种方法中,您不必在每次想要获取此数据时都显式提供所有 table,但如果您的 N每次取值都不一样

我建议 dynamic SQL approach

这是您可以尝试的快速示例,但是这确实假设您的 table 名称确实遵循 table_1table_2

的约定

这在SQL服务器中,但应该很容易应用于其他技术。

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   table_1 
WHERE  ( condition1 ) 
       AND ( condition2 ) 
GROUP  BY column1, 
          column2, 
          column3 
UNION 
SELECT column1, 
       column2, 
       column3, 
       Count(*) 
FROM   table_2 
WHERE  ( condition1 ) 
       AND ( condition2 ) 
GROUP  BY column1, 
          column2, 
          column3 

您的查询可以写成:

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;