1

假设我有一个包含很多行和列的表(别名:bigtable),以及一个始终有 1 行但多列的表(别名:1rowtable)。1rowtable 与 bigtable 无关,它只是用于我的脚本使用的一些动态修改的设置。所以我不能为此使用静态 SQLCMD 变量,也不能为此使用普通变量,因为我的脚本有 GO 语句。

现在我想编写一个访问两个表的选择语句。

如果我做:

SELECT ... FROM bigtable, 1rowtable

它做了一个 CROSS JOIN 所以这很糟糕,不能走那条路。

如果我对 1rowtable 使用 CTE,我必须使用

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。微软 sql 服务器 2008r2

4

1 回答 1

2

使用交叉连接将表中的行汇集在一起​​并没有错,尤其是当一个表只有一行时。

使用语法:

select bt.*, ort.*
from bigtable bt cross join
     onerowtable ort

当正确使用交叉连接时,它们本质上没有“错误”。问题是当它们被无意使用时。如果您交叉连接具有一百万行的两个表。. . 好吧,您的临时空间将被填满,您的处理器将非常繁忙,并且由于缺乏资源,查询最终会崩溃。

但是,将具有一行的表交叉连接到另一个表完全没有问题。

于 2012-07-21T21:51:46.493 回答