【问题标题】:SQL to combine columns for two tables with same number of rowsSQL组合两个具有相同行数的表的列
【发布时间】:2020-01-23 10:33:09
【问题描述】:

我有两张表要合并。它们每个都包含相同的行数,我希望我的结果具有相同的行数,但两者的列数相同。表 A 中的哪一行与表 B 中的哪一行匹配并不重要。原因是我正在编写的查询将链接这些行,所以目前它们之间没有链接。

我目前的方法(下面的 SQL)是从带有行号的每个表中选择数据,然后根据该行号连接表。这给出了我想要的结果,但是有没有更简单的方法呢?

SELECT IdA, IdB
FROM (
    SELECT IdA, ROW_NUMBER() OVER(ORDER BY IdA) RowNum 
    FROM TableA
) a
JOIN (
    SELECT IdB, ROW_NUMBER() OVER(ORDER BY IdB) RowNum 
    FROM TableB
) b
ON a.RowNum = b.RowNum;

【问题讨论】:

  • 如果你设法得到结果,为什么要质疑它?在性能方面是不是太贵了?
  • “更容易”是一个相对术语。
  • 写起来很麻烦,因为我不得不写很多次。感觉像是某种可能有标准方法的东西(类似于连接的东西),所以我想检查一下我没有遗漏任何东西。
  • @Tim - 你所说的“[...] 我不得不做很多次”是什么意思?
  • 我的意思是写了好几遍。这是一个更大的 SQL 工作的一小部分,并且这个需求不断出现不同的数据集。我从这些 cmets 中得到的印象是,我没有明显的替代方案,这很好。但是,如果我可以做一些更简单的事情(例如 TableA COLUMNJOIN TableB),那么它会节省我编写不必要的冗长 SQL 的工作。

标签: sql-server


【解决方案1】:

我找到了一个示例(可能的解决方案)here,并提取了解决方案以供参考:

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

为了不重复自己一次又一次地编写它,您可以创建一个 STORED PROCEDUREVIEW 并在每次需要时从第 3 方应用程序调用它。通过这种方式,您可以确保您尊重DRY 的概念:

  CREATE STORED PROCEDURE MyProc
    AS
    BEGIN
    --you could insert a TRY CATCH block -- not mandatory
        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
    END
    GO

CREATE VIEW MyView
AS

SELECT ....

GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    相关资源
    最近更新 更多