【问题标题】:Joining single column two tables in to another table with two columns and Converting in to Integer?将单列两个表连接到另一个具有两列的表并转换为整数?
【发布时间】:2013-09-13 18:30:10
【问题描述】:
我有两个带有单列的 #temp 表,我需要通过将一列转换为 INT 来将这两列转移到新的 #temp 表中吗?
#ProductID
Pid
4
7
8
9
23
88
#Name
Name
tom
jerry
harry
jim
jack
jones
如何插入具有两列的新临时表并将#ProductID 列更改为 Int 数据类型?
新的临时表应如下所示:
#Temp1
Pid name
4 tom
7 jerry
8 harry
9 jim
23 jack
88 jones
【问题讨论】:
标签:
sql-server
tsql
sql-server-2008-r2
temp
【解决方案1】:
假设在您的示例中 4 与“tom”一起使用,7 与“jerry”一起使用,并且您拥有 SQL Server 2005 或更高版本。您必须使用 ROW_NUMBER() 函数。
这基本上是你必须做的。根据您的两个表的类型,可能会略有偏差。
SELECT
ProductID,
name
INTO #Result
FROM
(
SELECT
Pid,
ROW_NUMBER() OVER (ORDER BY Fake) AS RowID
FROM
(
SELECT
Pid,
1 AS Fake
FROM #ProductID
) InnP
) P
INNER JOIN
(
SELECT
Name,
ROW_NUMBER() OVER (ORDER BY Fake) AS RowID
FROM
(
SELECT
Name,
1 AS Fake
FROM #Name
) InnP
) N ON N.RowID = P.RowID;
编辑:如果您的原始临时表不是 INT 类型,那么最终结果将需要“CONVERT(INT, Pid) AS Pid”。我假设您还知道如何创建临时表,以防万一您在结果的“FROM”之前不知道,您可以添加“INTO #Whatever”或提前创建临时表和“INSERT INTO #Whatever” '。
编辑 2:显然 ROW_NUMBER() 不允许您按常量排序,因此查询变得更加复杂...
【解决方案2】:
如果表中没有排序键,则无法确保您可以按照插入的顺序检索那里的信息。
我假设您以给定的顺序将信息插入到#Name 中,并希望保留以备将来使用。因此,为了保持该顺序,您应该在表格中添加一个identity column。
CREATE TABLE #Name
(
id INT IDENTITY(1,1),
[Name] VARCHAR(100)
)
之后,您将能够将两个表合并为一个。
SELECT CONVERT(INT, Pid) AS nPid, [name]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY CONVERT(INT, Pid ) )as RN , Pid
FROM #ProductID) p
INNER JOIN #Name ON p.RN = id
Fiddle 中的示例由于 fiddle 的性质而不能使用临时表,否则与上述完全相同。