【问题标题】:How to join two tables without any condition如何无条件连接两个表
【发布时间】:2012-01-18 19:29:09
【问题描述】:

例如,我有两个表(临时表)。其中一个只包含 ID,另一个包含真实信息。它们的行号完全相同。

#Table1
ID
14
15
16

#Table2
CarModel    Year
Ford        1996
Ferrari     2005
Toyota      2010

如何将这两个表合二为一(没有任何条件,只是结果表有 3 列,无论顺序如何)?我需要它来插入真实表的结果

Cars
ID   CarModel   Year

而且这个表不使用身份。有一种自己的机制来获取用于插入的 ID。 我无法更改它。

因此,我需要一个如下表之一(排序并不重要):

#Table3
ID   CarModel    Year
14   Ford        1996
15   Ferrari     2005
16   Toyota      2010

#Table3
ID   CarModel    Year
16   Ford        1996
14   Toyota      2010
15   Ferrari     2005

附:我了解如何使用 CTE 和 row_number() 来做到这一点,但我认为有更简单的方法来完成这项任务。并且可能此代码将在 MS SQL Server 2000 中使用,因此我很乐意查看解决方案的其他变体。

【问题讨论】:

  • row_number() 将是实现此目的的方法。但是,如果它们实际上不包含相关数据,我将不得不质疑为什么要在这两个表上进行连接。
  • CTE 和 ROW_NUMBER 对我来说似乎是最好的方法。对于 SQL Server 2000,您需要使用 identity 列或三角连接或使用游标来模拟它。
  • @Tejs 谢谢你的回答。我需要这个加入日期插入到真实(不是临时)表中。而且我需要我插入的行具有我从存储过程中获得的 ID。但我真的不在乎每一行的具体 id 是什么。我只需要它们都来自我的“池”是的,它不是最好的模式,但它是并且我必须使用它。
  • 天啊,你真的不应该那样做!不能保证 SQL Server 会保留任何顺序。你不能随便选择一行然后说“嘿,你将有这个 ID 用于一次查询!”。

标签: sql sql-server join sql-server-2000


【解决方案1】:

根据 Martin Smith 的评论,这是一个适用于 SQL Server 2000 的三角连接:

-- Some test data:
declare @Table1 table (
    ID int primary key
)
insert into @Table1 select 14
insert into @Table1 select 15
insert into @Table1 select 16

declare @Table2 table (
    CarModel varchar(50) not null,
    [Year] smallint not null
)
insert into @Table2 select 'Ford', 1996
insert into @Table2 select 'Ferrari', 2005
insert into @Table2 select 'Toyota', 2010

-- Here's the actual query:
select Table1.ID, Table2.CarModel, Table2.[Year]
from (
        select ID, (select count(*) from @Table1 where ID < a.ID) as JoinPredicate
        from @Table1 as a
    ) as Table1
    join (
        select CarModel, [Year], (select count(*) from @Table2 where CarModel < a.CarModel or (CarModel = a.CarModel and [Year] < a.[Year])) as JoinPredicate
        from @Table2 as a
    ) as Table2 on Table1.JoinPredicate = Table2.JoinPredicate

当然,这里假设 Table1.ID 是唯一的,Table2.CarModel + Table2.Year 是唯一的。

这里很好地讨论了三角连接的性能注意事项:http://www.sqlservercentral.com/articles/T-SQL/61539/

【讨论】:

  • 为什么是复杂的铸造条件?而不是where CarModel &lt; a.CarModel or (CarMoDel = a.CarModel and [Year] &lt; a.[Year])
  • 执行计划和统计 io 在我的盒子上是相同的。无论如何,由 OP 进行任何更改以符合他的代码标准。
  • 小桌子没关系。
  • @ypercube,我已更新为使用您更优雅的 JoinPredicate 版本。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 2017-06-29
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多