使用什么 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
...
JOIN
和 UNION
之间的区别在于,如果您使用联接,您的列将不会全部集中在一起,每个 table 会有不同的列而且数据必须在每个 table 的特定列中匹配,我猜这不是你想要的,因为使用了联合。
bjorsig 确实建议了一种 VIEW
方法,在这种方法中,您不必在每次想要获取此数据时都显式提供所有 table,但如果您的 N
每次取值都不一样
我建议 dynamic SQL approach。
这是您可以尝试的快速示例,但是这确实假设您的 table 名称确实遵循 table_1
、table_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;
我需要缩短此 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
...
JOIN
和 UNION
之间的区别在于,如果您使用联接,您的列将不会全部集中在一起,每个 table 会有不同的列而且数据必须在每个 table 的特定列中匹配,我猜这不是你想要的,因为使用了联合。
bjorsig 确实建议了一种 VIEW
方法,在这种方法中,您不必在每次想要获取此数据时都显式提供所有 table,但如果您的 N
每次取值都不一样
我建议 dynamic SQL approach。
这是您可以尝试的快速示例,但是这确实假设您的 table 名称确实遵循 table_1
、table_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;