【问题标题】:Create Query to join 2 tables 1 on 1 with nothing in common创建查询以 1 对 1 连接 2 个表,但没有共同点
【发布时间】:2016-02-25 21:31:11
【问题描述】:

我有一个表 TAB_1,它有 230 行。

CREATE TABLE TAB_1 (audit_id bigint NOT NULL PRIMARY KEY)

我有另一个表 TAB_2,它也有 230 行。

CREATE TABLE TAB_2 (employee_id bigint NOT NULL PRIMARY KEY, first_name varchar(50) NOT NULL, last_name varchar(50) NOT NULL)

这两张表没有任何共同之处。

我想编写一个查询,它将为我提供这 2 个表中的所有列 1 对 1(即 TAB_1 的第一行和 TAB_2 的第一行,TAB_1 的第二行和 TAB_2 的第二行等等)。该查询也将有 230 行。

我该怎么做?

我尝试了这些查询,但它们的结果是 TAB_1 中的每一行乘以 TAB_2 中的每一行:

select a.audit_id, b.employee_id, b.first_name, b.last_name
from TAB_1 a inner join TAB_2 b on 1 = 1

select a.audit_id, b.employee_id, b.first_name, b.last_name
from TAB_1 a cross join TAB_2 b 

【问题讨论】:

  • 加入 ROW_NUMBER()。

标签: sql sql-server join


【解决方案1】:

您需要一个密钥才能加入。您可以使用row_number() 获取此信息:

select t1.*, t2.*
from (select t1.*, row_number() over (order by audit_id) as seqnum
      from tab_1 t1
     ) t1 full outer join
     (select t2.*, row_number() over (order by employee_id) as seqnum
      from tab_2 t2
     ) t2
     on t1.seqnum = t2.seqnum;

这假定排序基于第一列。 full outer join 将返回所有行,无论它们是否具有相同的行数。

【讨论】:

    【解决方案2】:

    您不想在“无”的情况下加入,因为您最终会得到一个笛卡尔联接——这将使您获得超过 230 行。相反,您想加入行号。 Here's someone that did it for you already.

    【讨论】:

    • 笛卡尔连接或交叉连接!每天学习一些东西...这里有一个链接供那些想要了解更多信息的人使用,这正是我所需要的...tutorialspoint.com/sql/sql-cartesian-joins.htm
    • (ps - 同意这不是 OP 想要的……我的用例不同,我实际上想要 n*k 行)
    【解决方案3】:

    创建两个新查询并加入它们:

    这些新查询将有一个新列:row_number()

    Select *, Row_NUMBER() as rowTab1 from TAB_1

    Select *, Row_Number() as rowTab2 from Tab_2

    现在创建包含前两个视图的第三个查询并加入 rowTab1 = rowTab2

    【讨论】:

      【解决方案4】:

      如果您可以在两个表上添加额外的列,例如“joinparameter”,并将其从 1 变为 230 并加入,那么这两个可能都可以工作。

      类似这样的:

      选择 a.audit_id、b.employee_id、b.first_name、b.last_name 从 TAB_1 a 内连接 TAB_2 b on a.joinparameter = b.joinparameter

      或者如果 audit_id 和 employee_id 都从 1 变为 230,您可以加入它们

      【讨论】:

        猜你喜欢
        • 2015-01-27
        • 2011-08-18
        • 2013-03-04
        • 1970-01-01
        • 1970-01-01
        • 2013-05-31
        • 1970-01-01
        • 1970-01-01
        • 2014-03-12
        相关资源
        最近更新 更多