如何按顺序将两个表连接在一起,行数相同

时间:2009-04-27 11:52:54

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

我正在使用SQL2000,我想根据他们的职位加入两个表

例如,考虑以下两个表:

table1
-------
name
-------
'cat'
'dog'
'mouse'

table2
------
cost
------
23
13
25

我现在想根据它们的顺序盲目地将两个表连接在一起,而不是在匹配的列上(我也可以保证两个表具有相同的行数):

-------|-----
name   |cost
-------|------
'cat'  |23
'dog'  |13
'mouse'|25

这是否可以在T-SQL select ??

中实现

9 个答案:

答案 0 :(得分:5)

这可能是 NOT ,因为绝对不能保证选择行的顺序。

有很多方法可以达到你想要的效果(见其他答案)如果你对排序顺序很幸运,但是如果你没有,那么没有一种方法可行,你不应该这样做依赖于此类查询。

被迫做这种查询强烈反映了糟糕的数据库设计。

答案 1 :(得分:2)

在2000年,您将要么只运行2个前向游标并插入临时表。或者将值插入带有额外标识列的临时表中,并在标识字段

上连接2个临时表

答案 2 :(得分:2)

如果您的表不是两个大表,您可以在内存中创建两个临时表,并按特定顺序选择您的内容,然后将它们连接到行号。

e.g。

CREATE TABLE #Temp_One (
    [RowNum] [int] IDENTITY (1, 1) NOT NULL ,
    [Description] [nvarchar] (50) NOT NULL
)

CREATE TABLE #Temp_Two (
    [RowNum] [int] IDENTITY (1, 1) NOT NULL ,
    [Description] [nvarchar] (50) NOT NULL
)

INSERT INTO #Temp_One
SELECT Your_Column FROM Your_Table_One ORDER BY Whatever

INSERT INTO #Temp_Two
SELECT Your_Column FROM Your_Table_Two ORDER BY Whatever

SELECT * 
FROM #Temp_One a 
    LEFT OUTER JOIN #Temp_Two b 
         On a.RowNum = b.RowNum

答案 3 :(得分:1)

你有什么能保证每张桌子的订购吗?

据我所知,除非外部查询具有order by子句,否则SQL Server不会对结果集的排序做出任何承诺。 在您的情况下,您需要以确定的方式对每个表进行排序,以使其正常工作。

除此之外,在SQL 2000中,正如我之前所回答的那样,临时表和两个游标似乎是一个很好的答案。

更新: 有人提到将两个表插入到临时表中,并且它会产生更好的性能。我不是SQL专家所以我尊重那些在这方面知道的人,因为我有一个向上投票,我认为你应该调查那些性能考虑因素。 但无论如何,如果你的桌子上没有任何其他信息,那么你不能确定你可以将它拉下来,顺序排序。

答案 4 :(得分:1)

绝对。使用以下查询,但确保(order by)子句使用相同的列行的顺序将更改您不想要的。

select
(
row_number() over(order by name) rno, * from Table1
) A  
(
row_number() over(order by name) rno, * from Table2
) B
JOIN A.rno=B.rno

order by子句可以根据用户链接进行修改

上面的查询为每一行产生唯一的row_numbers,并与另一个表的row_numbers连接

答案 5 :(得分:0)

考虑使用排名(Oracle中的rownum)动态地将有序的唯一数字应用于每个表。只需加入排名列,您就应该拥有所需的一切。请参阅此Microsoft article on numbering rows

答案 6 :(得分:0)

最好使用row_number(),但这只适用于2005和2008,这应该适用于2000 ...

试试这个:

create table table1 (name varchar(30))
insert into table1 (name) values ('cat')
insert into table1 (name) values ('dog')
insert into table1 (name) values ('mouse')

create table table2 (cost int)
insert into table2 (cost) values (23)
insert into table2 (cost) values (13)
insert into table2 (cost) values (25)

Select IDENTITY(int,1,1) AS RowNumber
, Name
INTO #Temp1
from table1


Select IDENTITY(int,1,1) AS RowNumber
, Cost
INTO #Temp2
from table2

select * from #Temp1
select * from #Temp2

SELECT
    t1.Name, t2.Cost
    FROM #Temp1                 t1
        LEFT OUTER JOIN #Temp2  t2 ON t1.RowNumber=t2.RowNumber
    ORDER BY t1.RowNumber

答案 7 :(得分:0)

Xynth - 内置行编号在SQL2K5之前不可用,不幸的是,微软给出的例子实际上使用了三角形连接 - 如果表格变大,则会出现可怕的隐藏性能。我首选的方法是使用identity函数插入一对临时表,然后加入这些,这基本上是已经给出的相同答案。我认为双光标的方法听起来比它完成这项任务要重得多。

答案 8 :(得分:0)

您可以将两个表更改为具有auto_increment列,然后加入该表。

正如其他人告诉你的那样,SQL没有内在的排序;行表是一组。您获得的任何排序都是任意的,除非您添加order by子句。

所以是的,有很多方法可以做到这一点,但所有这些都依赖于意外排序是你希望的。所以这一次这样做,不要再做了,除非你能想出一种方法(auto_increments,自然键,某些东西)来确保订购。