Sql 如何获得一个表中与另一个表中不同注册表的特征特别匹配的注册表数?
这是一个困扰我几天的问题。我不太精通SQL,所以如果这看起来很明显,请容忍我 我有两张桌子,一张有点像这样的配料: 项目成分 ----- ------------- A01 Ing-01 A01 Ing-02 A01 Ing-03 A02 Ing-01 A02 Ing-03 A02 Ing-05 A03 Ing-02 A03 Ing-12 A03 Ing-22 . . . A99 Ing-04 比如说,A01项有一套由三种成分组成的特定组合 然后,还有一个更大的表,包含如下信息: 包装材料 ----- ------------ AAA Ing-01 AAA Ing-02 AAA Ing-03 ABB Ing-72 ABB Ing-74 ABB Ing-81 密件抄送Ing-01 密件抄送Ing-02 密件抄送Ing-07 . . . ZQY Ing-02 这里的挑战是,我需要一个快速的方法来确定有多少包确切的成分为一个给定的项目。到目前为止,我必须运行一个查询来查找给定项目的配料集,然后运行一个单独的查询来计算正好包含该配料集的包装数量。所以,我试着组合一个查询来提供这些信息 问题变得更加复杂,因为在一些孤立的情况下,我可能需要知道有多少包至少包含两种成分,因此我必须以这样一种方式构建查询,即只需对其进行最小程度的更改即可获得结果 有可能吗,还是我做得太过分了?我们将非常感谢您的任何帮助和建议Sql 如何获得一个表中与另一个表中不同注册表的特征特别匹配的注册表数?,sql,database,oracle,Sql,Database,Oracle,这是一个困扰我几天的问题。我不太精通SQL,所以如果这看起来很明显,请容忍我 我有两张桌子,一张有点像这样的配料: 项目成分 ----- ------------- A01 Ing-01 A01 Ing-02 A01 Ing-03 A02 Ing-01 A02 Ing-03 A02 Ing-05 A03 Ing-02 A03 Ing-12 A03 Ing-22 . . . A99 Ing-04 比如说,A01项有一套由三种成分组成的特定组合 然后,还有一个更大的表,包含如下信息:
关于,如果我们假设所有物品都由三种成分制成,并且所有包装也有三种成分,那么您可以通过此查询轻松找到包装和物品之间的匹配: ITEM INGREDIENTS ----- ------------- A01 Ing-01 A01 Ing-02 A01 Ing-03 A02 Ing-01 A02 Ing-03 A02 Ing-05 A03 Ing-02 A03 Ing-12 A03 Ing-22 . . . A99 Ing-04 您可以将查询中的常量
3
替换为2,以查找至少有2种成分与物品相同的包装:
PACK INGREDIENTS
----- ------------
AAA Ing-01
AAA Ing-02
AAA Ing-03
ABB Ing-72
ABB Ing-74
ABB Ing-81
BCC Ing-01
BCC Ing-02
BCC Ing-07
.
.
.
ZQY Ing-02
如果成分的数量未知,此查询将返回精确匹配:
SQL> SELECT p.pack, i.item, COUNT(*)
2 FROM pack p
3 JOIN item i ON p.ingredient = i.ingredient
4 GROUP BY p.pack, i.item
5 HAVING COUNT(*) >= 3;
PACK ITEM COUNT(*)
---- ---- ----------
AAA A01 3
如果我们假设所有物品都由三种成分制成,并且所有包装也有三种成分,那么您可以通过此查询轻松找到包装和物品之间的匹配: ITEM INGREDIENTS ----- ------------- A01 Ing-01 A01 Ing-02 A01 Ing-03 A02 Ing-01 A02 Ing-03 A02 Ing-05 A03 Ing-02 A03 Ing-12 A03 Ing-22 . . . A99 Ing-04 您可以将查询中的常量
3
替换为2,以查找至少有2种成分与物品相同的包装:
PACK INGREDIENTS
----- ------------
AAA Ing-01
AAA Ing-02
AAA Ing-03
ABB Ing-72
ABB Ing-74
ABB Ing-81
BCC Ing-01
BCC Ing-02
BCC Ing-07
.
.
.
ZQY Ing-02
如果成分的数量未知,此查询将返回精确匹配:
SQL> SELECT p.pack, i.item, COUNT(*)
2 FROM pack p
3 JOIN item i ON p.ingredient = i.ingredient
4 GROUP BY p.pack, i.item
5 HAVING COUNT(*) >= 3;
PACK ITEM COUNT(*)
---- ---- ----------
AAA A01 3