我有两张桌子
Table: color_document
+----------+---------------------+
| color_id | document_id |
+----------+---------------------+
| 180907 | 4270851 |
| 180954 | 4270851 |
+----------+---------------------+
Table: color_group
+----------------+-----------+
| color_group_id | color_id |
+----------------+-----------+
| 3 | 180954 |
| 4 | 180907 |
| 11 | 180907 |
| 11 | 180984 |
| 12 | 180907 |
| 12 | 180954 |
+----------------+-----------+
查询是否可以使用多个颜色ID来获取看起来像这样的结果来连接这两个表?
Result
+----------------+--------------+
| color_group_id | document_id |
+----------------+--------------+
| 12 | 4270851 |
+----------------+--------------+
由于Color Group 12是唯一具有Document 4270851具有的完全相同颜色组的组。
我有一些不好的数据,我被迫使用,因此我必须通过查找与document_id相关联的每个唯一的color_id集来制作颜色组。我正试图在我制造的颜色组和文档之间直接创建一个新的关系。
我知道我可以用GROUP_CONCAT做一些事情来制作串联颜色ID的伪键,但我正在尝试找到一个也适用于Oracle的解决方案。我用这种逻辑咆哮着完全错误的树吗?
我的最终目标是能够在表格中有一行代表与文档相关联的任意数量的颜色,这些颜色要导出到与我正在使用的系统完全不同的系统。
非常感谢任何想法/意见/建议。
提前感谢您查看我的问题。
答案 0 :(得分:3)
执行两个表的正常连接,并计算每个配对中的行数。然后测试这是否与每个项目在原始表格中出现的次数相同。如果全部相同,则所有颜色ID必须匹配。
SELECT a.color_group_id, a.document_id
FROM (
SELECT color_group_id, document_id, COUNT(*) ct
FROM color_document d
JOIN color_group g ON d.color_id = g.color_id
GROUP BY color_group_id, document_id) a
JOIN (
SELECT color_group_id, COUNT(*) ct
FROM color_group
GROUP BY color_group_id) b
ON a.color_group_id = b.color_group_id and a.ct = b.ct
JOIN (
SELECT document_id, COUNT(*) ct
FROM color_document
GROUP BY document_id) c
ON a.document_id = c.document_id and a.ct = c.ct
答案 1 :(得分:-1)
如果我理解你的问题是正确的,你只需要加入这两个表,然后通过color_group_id将结果分组为document_id。
select color_group_id, document_id
from
color_document cd join
color_group cg
on cd.color_id = cg.color_id
group by color_group_id, document_id
该查询将为您提供此结果集:
COLOR_GROUP_ID DOCUMENT_ID
3 4270851
4 4270851
11 4270851
12 4270851
这就是你想要的吗?