【问题标题】:Duplicate pairs in SQL cross join?SQL交叉连接中的重复对?
【发布时间】:2015-10-18 07:44:21
【问题描述】:

我知道在 SO 上有很多类似的问题,我查看了其中的一些,即this,但这不足以解决我的问题

我有一张桌子proposals,看起来像这样:

proposalNum | PI        | department | investigator | investigatorDepartment|
---------------------------------------------------------------------------- 
FP00003521  | Bush,Raj  | GIS        | Amm,Anna     | CIS                   |
FP00003521  | Bush,Raj  | GIS        | Milton,Ross  | CIS                   |
FP00003521  | Bush,Raj  | GIS        | Landis, Amy  | SEB                   |
FP00069606  | Mill, Ash | DIA        | Keller, Bill | FAA                   |

我基本上想看看investigator字段并创建:

Amm,Anna     | Milton, Ross 
Amm,Anna     | Landis, Amy
Milton,Ross  | Landis, Amy 

对于所有拥有CIS 的调查员,以及给定的proposalNum(在本例中为FP00003521

(这里是SQL FIDDLE

我这样做了:

SELECT p1.investigator,p2.investigator
FROM proposals AS p1
CROSS JOIN proposals AS p2 
WHERE p1.investigatorDepartment='CIS' 
AND p1.investigator!=p2.investigator
AND p1.proposalNum=p2.proposalNum

得到:

Milton,Ross  | Amm,Anna 
Amm,Anna     | Milton,Ross
Amm,Anna     | Landis, Amy
Milton,Ross  | Landis,Amy

但是那里有重复...

按照链接帖子上的逻辑,我也尝试了:

SELECT p1.investigator,p2.investigator
FROM proposals AS p1
CROSS JOIN proposals AS p2 
ON p1.investigator < p2.investigator
WHERE p1.investigatorDepartment='CIS' 
AND p1.investigator!=p2.investigator
AND p1.proposalNum=p2.proposalNum

我得到了这个:

Amm,Anna     | Milton,Ross
Amm,Anna     | Landis, Amy

问题是当我添加ON p1.investigator &lt; p2.investigator 条件时,它也不会添加Milton,RossLandis, Amy,因为M &gt; L

我将如何重写我的查询来解决这个问题?

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • p1.investigatorDepartment='CIS' -> Landis, Amy 的部门是 SEB。这就是它没有出现的原因。您应该修改您的规则,或将p1.investigatorDepartment='CIS' 更改为(p1.investigatorDepartment='CIS' OR p2.investigatorDepartment='CIS')
  • @Sebas 谢谢...但是如果Landis,Amy 没有出现的原因是因为='CIS' 条件,为什么它会出现在第一个?我尝试了OR 条件,但重复次数更多。
  • Landis,Amy 出现在第一个,但在右侧,因为 Amm,Anna 被包括在内。你想要它在左边。
  • @Sebas Um.... 为什么我要在左侧?
  • 不知道怎么解释。你的规则是歪的。您应该使 p1 和 p2 受 CIS 限制,否则您希望实现的唯一性约束以过滤掉重复项也应该使用该列。

标签: mysql sql join duplicate-removal cross-join


【解决方案1】:

您可以加入那些与非独联体不同的p2's。一种方法如下。

select
  p1.investigator,
  p2.investigator
from
  proposals AS p1
    cross join
  proposals AS p2 
where
  p1.investigatorDepartment = 'CIS' and ((
      p2.investigatorDepartment = 'CIS' and 
      p1.investigator < p2.investigator
  ) or (
      p2.investigatorDepartment != 'CIS' or
      p2.investigatorDepartment is null
  )) and
  p1.proposalNum = p2.proposalNum;

SQL Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多