【发布时间】:2016-12-02 16:31:10
【问题描述】:
考虑以下多对多表:
FK_Composition | FK_Part | Position | Quantity
---------------+---------+----------+---------
101 | 2001 | -3 | 1
101 | 2002 | -2 | 2
101 | 2003 | -1 | 1
101 | 2011 | 0 | 1
102 | 2001 | -2 | 1
102 | 2002 | -1 | 2
102 | 2003 | 0 | 1
102 | 2012 | 1 | 1
目标是通过比较找到与某个构图几乎相同的构图。 “差不多”的意思:
- 比较的构图由与原始部分相同的部分组成,除了位置最高的部分
- 所有部分都必须位于相同的相对位置(在将合成与位置 [-1,0, 1,2])
- 每个出现的部分都应具有相同的数量
- 比较的作品没有比原始作品更多的部分
按照这些规则,作文 102几乎与 101 相同。
当然,我的问题更有趣:我们的实体框架只允许使用简单的 SELECT 查询并且我们应该同时支持 SQL Server 数据库以及访问“数据库” ”。查询应该同时支持系统和临时表,循环是不行的。
我使用不同的数据库已经有一段时间了,但我不记得我以前曾像这样在自联接中匹配多行中的多个值。然而,我认为有理由认为应该有一个简单的方法来实现这一点。有吗?
额外问题:我正在考虑在 .NET 应用程序中以不同的部分查询我需要的数据,并让 Linq 发挥作用,但有人担心某些客户的计算机可能无法很好地处理过多的内存数据.我们谈论的数据可能多达一百万行,具体取决于客户的数据库。这是一个有效的担忧吗?
编辑 - 根据 cmets 的要求,以下是一些反例,其中的构图与构图 101 相比不应匹配:
FK_Composition | FK_Part | Position | Quantity | Reason
---------------+---------+----------+----------+------
151 | 2001 | -3 | 1 | Part 2004 is no match
151 | 2002 | -2 | 2 |
151 | 2004 | -1 | 1 |
151 | 2011 | 0 | 1 |
152 | 2001 | -2 | 1 | Has a different number of parts
152 | 2002 | -1 | 2 |
152 | 2012 | 0 | 1 |
153 | 2001 | 1 | 2 | Position 1 has the wrong quantity
153 | 2002 | 2 | 2 |
153 | 2004 | 3 | 1 |
153 | 2011 | 4 | 1 |
【问题讨论】:
-
您可能应该添加更多测试用例来解释其他一些细微差别。例如它们是否也必须具有相同数量的零件?例如。如果 103 有 6 个部分并且前 3 个匹配 101 中的前 3 个会是一个紧密匹配吗?
-
我认为 1) 是说它们必须具有相同的部分(最高位置除外)。但我同意更多的例子会很有帮助——至少是一个不匹配的反例。您还会得到一组不连续的位置,例如(1,2,2,3) 还是 (1,3,6578)?最高部分的数量需要匹配吗?
-
@Matt 是的,它们的零件数量相同。职位的数量和每个职位的数量都必须匹配。
-
@JamesCasey 据我所知,它们不应该是一组不连续的位置。至少它们不能是 (1,2,2,3) 之类的东西,因为该位置是主键的一部分。最高部分的数量需要匹配。
标签: c# sql sql-server ms-access subquery