加入多个字段,只过滤真正不同的行

Posted

技术标签:

【中文标题】加入多个字段,只过滤真正不同的行【英文标题】:JOINing on several fields, filtering only the truly different rows 【发布时间】:2017-10-13 20:09:18 【问题描述】:

我有两张表,每张都有 4 个字段。一个crc、一个title、一个parent和一个parent_type

这些表中的数据代表文件以及它们属于哪个实体。

具有相同CRC的文件可以属于多个实体。

第一个表代表一个时间点的快照,第二个表代表另一个时间点的快照。

当文件被“移动”时(将其视为文件系统mv 操作),parent 和/或parent_type 将发生变化。

我想获取在快照 A 和快照 B 之间移动的文件的列表。

这是我目前拥有的:http://sqlfiddle.com/#!5/89f0d4/1

请注意,file 1 属于 2 个不同的父母。 file 4 已添加/创建。 file 2 已从 2 GRUP 移动到 3 GRUP。那是我感兴趣的。

【问题讨论】:

这能回答你的问题吗? ***.com/questions/5676559/… @Nosajimiki 不。我已经知道如何加入(事实上,我提供的当前进度链接已经做到了)。我所要求的困难是“具有不同的多重连接”。 根据你的数据,一个文件可以同时在两个地方。对吗? @GordonLinoff 是的。我已经在问题的描述中提到了这一点:) 小提琴很棒,但想要的结果是什么样的 【参考方案1】:

如果我正确理解您的问题,您需要在组合中添加左连接以排除那些没有改变的人...见下文:

select a.*
  from memarxiu a
  join arxiu b
    on b.crc = a.crc
  left join (select *
               from arxiu) c
     on c.crc = a.crc
    and c.parent = a.parent
    and c.parent_type = a.parent_type
  where a.title = b.title
    and (a.parent <> b.parent
     or a.parent_type <> b.parent_type)
    and c.crc is null;

【讨论】:

让我检查一下我的真实数据。 它似乎不起作用。注意箭头指向的元素上parent 的变化:imagebin.ca/v/3dgU4CXIylpu

以上是关于加入多个字段,只过滤真正不同的行的主要内容,如果未能解决你的问题,请参考以下文章

使用可变数量的参数过滤多个 Django 模型字段

如何根据列过滤器缩小不同的行?

Spark上的Scala [自加入后过滤掉重复的行]

过滤掉超过一定数量的 NaN 的行

jQuery数据表过滤具有特定类的行

多次加入同一个表以每次使用过滤器检索不同的数据