【问题标题】:SQL Server - Cross join with where / on conditionSQL Server - 与 where / on 条件交叉连接
【发布时间】:2018-03-29 13:32:52
【问题描述】:

我有一张表,其中包含我想要交叉联接的员工的月度数据,但前提是要确保他们在同一个月内。表格如下所示:

  Month      Emp_id
1/1/2017      123
1/1/2017      234
1/1/2017      345
1/1/2017      456
2/1/2017      123
2/1/2017      234
2/1/2017      345
  ...

我想做这样的事情:

select *
from t1
cross join t1 as t2
   on t1.Month = t2.Month

有没有办法做到这一点?

编辑:

详细说明,如果我每个月和 12 个月有 100 名员工,我希望得到一个包含 120,000 行的输出表(每个月 100 * 100 笛卡尔,乘以 12(每个月 1)而不是做全笛卡尔坐标系,即 1,440,000。

【问题讨论】:

  • 您的意思是INNER JOIN? CROSS JOIN 用于创建笛卡尔积,您不要使用 ON 子句。 编辑:您可以使用WHERE 子句,但是CROSS JOIN 隐式变为INNER JOIN,然后使用正确的语法会更好。
  • @Larnu - 是的 - 有没有办法在给定的月份内创建笛卡尔?
  • 我真的不明白你的意思。对不起。您可能想尝试详细说明您的问题。

标签: sql sql-server join


【解决方案1】:

是的,它被称为inner join:

select *
from t1 inner join
     t1 t2
     on t1.Month = t2.Month

您可以使用where 和cross join 来表达相同的意思,但我认为inner join 比:

select *
from t1 cross join
     t1 t2
where t1.Month = t2.Month;

请注意,您使用的是select *,这意味着您将有重复的列名,并且不知道它们来自哪个t1。如果这是一个问题,请提出另一个问题。

【讨论】:

  • 内部连接会在每个月内给我笛卡尔吗?
  • @screechOwl - INNER JOIN 获取左侧表 (t1) 中的每一行并将其与右侧表中的每一行进行匹配 ( t2) 其中连接谓词 (t1.Month = t2.Month) 的计算结果为 TRUE。我强烈建议您简单地阅读一个基本的 SQL 教程,它将为您详细说明。
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 1970-01-01
相关资源
最近更新 更多