在连接中使用多行连接两个表

时间:2014-02-28 23:37:38

标签: mysql join multiple-columns

我有两张桌子

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的解决方案。我用这种逻辑咆哮着完全错误的树吗?

我的最终目标是能够在表格中有一行代表与文档相关联的任意数量的颜色,这些颜色要导出到与我正在使用的系统完全不同的系统。

非常感谢任何想法/意见/建议。

提前感谢您查看我的问题。

2 个答案:

答案 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

SQLFIDDLE

答案 1 :(得分:-1)

如果我理解你的问题是正确的,你只需要加入这两个表,然后通过color_group_id将结果分组为document_id。

SQL Fiddle

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

这就是你想要的吗?