SQL Server SQL、交叉连接替代/更快的解决方案

thigvfpy  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(170)

我们有一个包含两列的简单表,如下所示

+-------+-------+
| fname | lname |
+-------+-------+
| foo   | bar   |
+-------+-------+

我们还有另一个包含月份的表

+-------+
| month |
+-------+
| jan   |
| feb   |
| mar   |
+-------+

我们的目标是得到一个表,如下所示:

+-------+-------+-------+
| fname | lname | month |
+-------+-------+-------+
| foo   | bar   | jan   |
| foo   | bar   | feb   |
| foo   | bar   | mar   |
+-------+-------+-------+

为了得到这个表,我使用了一个cross join,但是当数据增加时,提取时间也呈指数级增长。这应该是一个简单的数据复制,并且只需要在每行的末尾添加月份列,但是在幕后看起来更复杂。是否有其他方法可以更快地运行这个查询?

jdgnovmf

jdgnovmf1#

资料

CREATE TABLE table1(fname  varchar(100),lname varchar(100))
insert into table1
(fname,lname) values
('foo','bar');
CREATE TABLE table2(month    varchar(100))
insert into table2
(month) values
('jan'),
('feb'),
('mar');

另一种方法是使用Cross Apply,但它比Cross Join

SELECT fname,
       lname,
       month
FROM   table2
       CROSS apply (SELECT *
                    FROM   table1
                    WHERE  1 = 1) A

如果您第一个表只有一个行结构,那么请忽略交叉连接,而使用valuealias

SELECT 'foo' fname,
       'bar' lname,
       month
FROM   table2

declare @fname varchar(100)=(select fname from table1)
declare @lname varchar(100)=(select lname from table1)
select @fname fname,
       @lname lname,
       month
FROM   table2

dbfiddle

相关问题