2012-07-21 79 views
1

假设我有一个有很多行和列(别名:bigtable)的表和一个总是有1行,但有多列(别名:1rowtable)的表。 lrowtable与bigtable无关,只是在那里为我的脚本使用的一些设置动态修改。所以我不能使用静态SQLCMD变量,因为我的脚本有GO语句,所以我不能使用正常变量。同时从两个不相关的表中选择

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

如果我做的:

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。 ms sql server 2008r2

回答

2

使用交叉连接将表中的行结合在一起没有任何问题,特别是当只有一行时。

使用语法:

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

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

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