同时从两个不相关的表中进行选择

时间:2012-07-21 20:59:13

标签: sql select join

假设我有一个包含大量行和列的表(别名: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

1 个答案:

答案 0 :(得分:2)

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

使用语法:

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

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

但是,将一行表格与另一个表格交叉连接不会产生任何问题。