5

我正在使用 SQL Server 2008。我有 2 个表变量,例如

FirstName
==========
Little
John  
Baby  

LastName
==========
Timmy
Doe  
Jessica

我希望结果表是:

 First      Last   
=====================
 Little     Timmy    
 John       Doe      
 Baby       Jessica

注意没有PK可以加入2个表。我正在尝试使用光标,但不知道如何开始。

- - 更新 - - -

我知道这是一种罕见的情况,但我正在编写一个脚本来清理遗留数据。我们知道“Little”与“Timmy”搭配的唯一方式是它们都是表格的第一条记录。如果我们对表格进行 PK 但没有关系会有所帮助吗?

ID FirstName
==========
1  Little
2  John  
3  Baby  
----------

ID LastName
==========
4  Timmy
5  Doe  
6  Jessica
----------

我不熟悉 TSQL,所以我想我可以遍历 2 个表,就像遍历内存中的数组一样。

4

5 回答 5

7

你可以尝试这样的事情,根据行号进行匹配:

SELECT FirstName AS First, LastName AS Last
FROM
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, FirstName
  FROM FirstName
) t1
INNER JOIN
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, LastName
  FROM LastName
) t2
ON t1.RowNum = t2.RowNum

但不要将此视为您不需要 keys的信号。

于 2012-05-22T17:07:27.160 回答
2

如果没有身份,您将无法可靠地连接这两个表变量。假设首先以序数方式填充它们,则可以使用如下标识创建每个表:

DECLARE @first TABLE(ID INT IDENTITY(1,1), NameFirst VARCHAR(30));
DECLARE @last TABLE(ID INT IDENTITY(1,1), NameLast VARCHAR(30));

-- Note that we don't need to list column names here
INSERT INTO @first VALUES('Little');
INSERT INTO @first VALUES('John');
INSERT INTO @first VALUES('Baby');

INSERT INTO @last VALUES('Timmy');
INSERT INTO @last VALUES('Doe');
INSERT INTO @last VALUES('Jessica');

SELECT n1.NameFirst
, n2.NameLast
FROM @first n1
INNER JOIN @last n2 ON n1.ID=n2.ID;

结果:

NameFirst                      NameLast
------------------------------ ------------------------------
Little                         Timmy
John                           Doe
Baby                           Jessica
于 2012-05-22T17:23:36.063 回答
1

没有“第一张唱片”这样的东西。阅读顺序完全未定义。这在实践中也适用!您在实践中看到随机行顺序。

需要定义排序顺序。之后,您可以像这样查询:

SELECT FirstName AS First, LastName AS Last
FROM
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS r, FirstName
  FROM FirstName
) t1
INNER JOIN
(
  SELECT ROW_NUMBER() OVER (ORDER BY ID) AS r, LastName
  FROM LastName
) t2
ON t1.r = t2.r

注意占位符“ SORT ORDER HERE”。需要填写。例如:“ID”或“FirstName”。

编辑:看到您的编辑后,我在 ID 上添加了排序顺序。现在可以使用了。

于 2012-05-22T17:19:08.313 回答
0

这是一个黑客,可能适用于您的情况:

select t1.id, t1.name, t2.name
from (select name, row_number() over (partition by null order by (select NULL)) as id
      from t1
     ) t1 join
     (select name, row_number() over (partition by null order by (select NULL)) as id
      from t2
     ) t2
     on t1.id = t2.id

以我的经验,带有订单子查询的 row_number() 意味着实际上没有进行任何排序,但行是按顺序引入的。如果您使用的是单线程实例,这更有可能起作用。

而且,我不保证它会起作用!一定要检查结果!如果这不起作用,您也许可以通过使用临时表来获得相同的效果。

这些数据是否来自数据库世界之外?如果您必须多次执行此过程,那么您应该在外部或在输入数据库时​​处理该问题。

于 2012-05-22T17:23:20.553 回答
0

在@JohnDewey 提出的解决方案的基础上,您可以将记录分类到表变量中。在实践中,它将根据记录的顺序创建值之间的关系:

DECLARE @first TABLE(sequence INT IDENTITY(1,1), FirstName VARCHAR(30));
DECLARE @last TABLE(sequence INT IDENTITY(1,1), LastName VARCHAR(30));

INSERT INTO @first(FirstName)
SELECT FirstName FROM TableFisrt ORDER BY id;
-- sequence FirstName
-- ======== =========
--        1  Little
--        2  John  
--        3  Baby 

INSERT INTO @last(LastName)
SELECT FirstName FROM TableLast ORDER BY id;
-- sequence LastName
-- ======== =========
--        1  Timmy
--        2  Doe
--        3  Jessica 

SELECT frs.FirstName, lst.LastName
FROM @first frs
INNER JOIN @last lst ON frs.sequence = lst.sequence;
-- sequence FirstName
-- ======== =========
-- Little   Timmy
-- John     Doe
-- Baby     Jessica 
于 2012-05-22T18:18:06.127 回答