【问题标题】:Selecting from two non-related tables at the same time同时从两个不相关的表中选择
【发布时间】:2012-07-20 16:48:57
【问题描述】:

假设我有一个包含很多行和列的表(别名: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。 ms sql server 2008r2

【问题讨论】:

    标签: sql select join


    【解决方案1】:

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

    使用语法:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多