假设我有一个包含大量行和列的表(别名:bigtable),以及一个总是有1行但多列(别名:1rowtable)的表。 1rowtable与bigtable无关,它只适用于我的脚本使用的动态修改的一些设置。所以我不能使用静态SQLCMD变量,因为我的脚本有GO语句,所以我不能使用普通变量。
现在我想编写一个访问BOTH表的select语句。
如果我这样做:
SELECT ... FROM bigtable, 1rowtable
它做了CROSS JOIN因此很糟糕,不能走那条路。
如果我将CTE用于1rowtable,我必须使用
访问其字段SELECT field FROM 1rowtable
所以这也很糟糕。与表值函数相同,如:
CREATE FUNCTION getSetting(@name nvarchar(40))
RETURNS TABLE
AS
RETURN (SELECT name FROM 1rowtable WHERE name = @name)
显然我根本不能使用标量函数,因为它只返回特定的数据类型,但设置具有不同的数据类型。然而,显然我想使用它像标量函数当然没有做'SELECT .. FROM dbo.getfieldfrom1rowtable(..)'的东西,因为我经常在查询中使用1rowtable。
我也尝试过:
SELECT
(SELECT
<expression involving bigtable and 1rowtable>,
<expression involving bigtable and 1rowtable>,
<expression involving bigtable and 1rowtable>,
...
FROM 1rowtable)
FROM bigtable
但是,当然,如果子选择不以“存在”开头,则子选择不能选择多个项目。
那我该怎么办?看来我每次都要继续使用'SELECT .. FROM dbo.getfieldfrom1rowtable(..)'吗?只是好奇:)
PS。 ms sql server 2008r2
答案 0 :(得分:2)
使用交叉连接将表中的行组合在一起没有任何问题,特别是当一个表只有一行时。
使用语法:
select bt.*, ort.*
from bigtable bt cross join
onerowtable ort
当正确使用交叉连接时,没有任何固有的“错误”。问题在于无意中使用它们。如果您交叉连接两个包含一百万行的表。 。 。好吧,你的临时空间将会填满,你的处理器将非常繁忙,并且由于缺乏资源,查询最终会崩溃。
但是,将一行表格与另一个表格交叉连接不会产生任何问题。