我正在使用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一样。
答案 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