【发布时间】:2015-05-13 02:41:34
【问题描述】:
我有两个表要加入,我希望每行只加入一次。这是示例数据:
CREATE TABLE A (id smallint, val varchar(1) );
CREATE TABLE B (id smallint, val varchar(1) );
INSERT INTO A VALUES (1, 'a'), (2, 'b'), (3, 'c'), (3, 'd');
INSERT INTO B VALUES (2, 'x'), (3, 'y'), (4, 'z'), (3, 'k');
当我们加入 id 时,我们获得:
mysql> SELECT * FROM A JOIN B ON A.id = B.id;
+------+------+------+------+
| id | val | id | val |
+------+------+------+------+
| 2 | b | 2 | x |
| 3 | c | 3 | y |
| 3 | d | 3 | y |
| 3 | c | 3 | k |
| 3 | d | 3 | k |
+------+------+------+------+
我想要的是:
+------+------+------+------+ +------+------+------+------+
| id | val | id | val | | id | val | id | val |
+------+------+------+------+ or +------+------+------+------+
| 2 | b | 2 | x | | 2 | b | 2 | x |
| 3 | c | 3 | y | | 3 | d | 3 | y |
| 3 | d | 3 | k | | 3 | c | 3 | k |
+------+------+------+------+ +------+------+------+------+
顺序和安排无关紧要。
有可能吗?怎么样?
根据this answer我需要指定如何选择匹配的行。在这种情况下,我想如果已使用连接表的行,则需要检查子查询;或者一种与id相关的计数器......但我不知道如何写这个。
编辑:
为了澄清我希望 ID 为 3 的每一行与连接表中的另一行映射,例如每一行只映射一次(我也有兴趣知道当具有相同 ID 的行数不同时会发生什么在两个表中):
(3, c) -> (3, y) [join only with the first row such as B.id = 3]
(3, d) -> (3, k) [the first row has been used, so map with (and only with) the second row such as B.id = 3]
但正如我所说的,映射可以是任何其他顺序(例如,以相反的顺序映射行)。
【问题讨论】:
-
您可以使用部分
GROUP BY来实现结果,但重点是什么?结果将是不确定的。 -
部分 GROUP BY 看起来像
SELECT a.id, a.val, b.val FROM a JOIN b ... GROUP BY a.id, a.val。不确定的部分是不能保证每个 (a.id, a.val) 对返回哪个 b.val。 -
“没关系”这句话通常是设计不佳的症状。这应该很重要!
-
我也很想知道当两个表中具有相同 id 的行数不同时会发生什么 - 那么应该发生什么,为什么在你的例子中是相同Id相同的行数?
-
我认为酒吧可以向上移动几个梯级,而不会在这里引起太多恐慌。 ;-)
标签: mysql sql join row-number