【问题标题】:Comparing two tables in SQL Server比较 SQL Server 中的两个表
【发布时间】:2017-11-01 06:49:54
【问题描述】:

我在这种形式的 SQL Server 中有两个表:

我想在“名称”列中加入这两个表(这两个表中都有重复项)。然后,我想比较“startNo”列的每一行并检查 table1.startNo >= table2.startNo,如果是,我想用表 2 的 UniqueRef 添加一个新列。

结果如上。

它检查表 2 中每一行的 table1.startNo >= table2.startNo 很重要,这是我无法弄清楚的部分

【问题讨论】:

  • 请编辑您的帖子以将示例数据包含为格式正确的文本。通过这种方式可以更轻松地使用数据并重新创建表以进行测试。
  • 您可以连接表和用例以确定您的结果中的 UniqueRef 列。虽然我不知道 bb1 是如何出现在第二行的结果中的。
  • @piyushpankaj 因为连接将在“名称”列上匹配,它将在前两个上匹配,然后它应该作为 2>=2 拉入 uniqueRef bb1
  • 糟糕,您的解释确实让我感到困惑,因为“每一行的 table1.startNo >= table2.startNo”意味着您只是比较每一行。请忽略我之前的评论。

标签: sql sql-server


【解决方案1】:

假设所有数字字段都是小数,这将为您提供所需的输出:

http://rextester.com/BYVC41019

CREATE TABLE Table1(UniqueRef VARCHAR(5), Name VARCHAR(10), startNo decimal(2, 1), endNo decimal(2, 1));
CREATE TABLE Table2(UniqueRef VARCHAR(5), Name VARCHAR(10), startNo decimal(2, 1), endNo decimal(2, 1));

INSERT INTO Table1(UniqueRef, Name, startNo, endNo)VALUES('aa1', 'name1', 1, 3);
INSERT INTO Table1(UniqueRef, Name, startNo, endNo)VALUES('aa2', 'name1', 2, 5);
INSERT INTO Table1(UniqueRef, Name, startNo, endNo)VALUES('aa3', 'name2', 5.5, 5);
INSERT INTO Table1(UniqueRef, Name, startNo, endNo)VALUES('aa4', 'name2', 1, 2);

INSERT INTO Table2(UniqueRef, Name, startNo, endNo)VALUES('bb1', 'name1', 2, 3);
INSERT INTO Table2(UniqueRef, Name, startNo, endNo)VALUES('bb2', 'name1', 3, 5);
INSERT INTO Table2(UniqueRef, Name, startNo, endNo)VALUES('bb3', 'name2', 5, 6);
INSERT INTO Table2(UniqueRef, Name, startNo, endNo)VALUES('bb4', 'name2', 6, 8);

SELECT
  T1.UniqueRef
, T1.Name
, T1.startNo
, T1.endNo
, T2.UniqueRef
FROM Table1 T1
LEFT JOIN Table2 T2             
              ON T1.Name = T2.Name
             AND T1.startNo >= T2.startNo

【讨论】:

    【解决方案2】:

    你的问题不正确。

    根据您的要求

    1. 按名称列加入
    2. 比较“startNo”列的每一行并检查是否 table1.startNo >= table2.startNo
    3. 重要的是它检查表 2 中每一行的 table1.startNo >= table2.startNo

    您给出的输出表的第 3 行不正确。 注意:第一个表中aa3的起始编号为4,大于第二个表中bb1或bb2的起始编号。 但是你给出的结果是 bb3 对 aa3

    【讨论】:

    • 现在您编辑了帖子。很抱歉编辑后发布。
    • 我认为@Jake 提供的答案输出了问题中提供的结果表。但它不满足我上面提到的要求 3。要求 3 -> 重要的是它为表 2 中的每一行检查 table1.startNo >= table2.startNo
    • 另外,如果我们将第一个表的aa1和aa2的startno更改为3和6,它会给出不同的行集。请检查
    【解决方案3】:

    对返回 Table2 的 TOP 1 UniqueRef WHERE the table1.startNo >= table2.startNo 的最后一列使用相关子选择

    【讨论】:

      猜你喜欢
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多