如何在不使用JOIN的情况下将2个表中的列合并为1

时间:2012-05-22 17:00:32

标签: sql sql-server tsql

我正在使用SQL Server 2008.我有两个表变量,如

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

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

我希望结果表为:

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

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

----更新了-----

我知道这是一种罕见的情况,但我正在编写一个脚本来清理遗留数据。我们知道“小”与“蒂米”的唯一方式是他们都是这张桌子的第一张唱片。如果我们有桌子的PK但它没有关系吗?

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

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

我不熟悉TSQL所以我认为我可以遍历2个表,就像在内存中循环遍历Arrays一样。

5 个答案:

答案 0 :(得分:6)

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

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

但请不要将此视为您不需要按键的信号。

答案 1 :(得分: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

答案 2 :(得分: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上添加了排序顺序。这将立即生效。

答案 3 :(得分:0)

这是一个hack,可能适合你的情况:

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()意味着实际上没有进行排序,但是按顺序引入行。如果您使用单线程实例,则更有可能工作。

并且,我不保证它会起作用!绝对检查结果!如果这不起作用,您可以通过使用临时表获得相同的效果。

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

答案 4 :(得分: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