0

我有以下三个表:

表 A:

id VARCHAR(32) | value VARCHAR(32) | groupId INT
abcdef         | myValue1          | 1
ghijkl         | myValue2          | 2
mnopqr         | myValue3          | 1

表 B:

id VARCHAR(32) | value VARCHAR(32) | userId INT
abcdef         | myValue4          | 1
uvwxyz         | anotherValue      | 1

表 C:

id VARCHAR(32) | someOtherColumns...
abcdef
ghijkl
mnopqr
...
uvwxyz

表 A 和 B 用于 am:n 关联,因此两个表中的“id”列引用相同的字段(表 c 中的“id”列)。我想要做的是(例如)......选择表A中的所有条目where groupId = 1

SELECT * FROM TableA WHERE groupId = 1

并选择表 B 中的所有条目where userId = 1

SELECT * FROM TableB WHERE userId = 1

这一切都没有问题......但是以下使选择语句变得困难:如何合并两个选择结果并替换第一个结果的值?例如:

选择表 A 中的所有条目,where groupId = 1我将得到 abcdef 和 mnopqr。当我选择表 B 中 userId = 1 的所有条目时,我还将获得 abdef(以及另外的 uvwxyz)。

现在,表 B 中 abcdef 的值应该替换表 A 的选择结果中的值。并且应该将 uvwxyz-entry 添加到结果中。

最后,我正在寻找一个生成下表的查询:

id VARCHAR(32) | value VARCHAR(32)
abcdef         | myValue4           -- myValue1 from the select-statement in tableA should be overwritten
mnopqr         | myValue2           -- from table A
uvwxyz         | anotherValue       -- from table B

我希望有人知道如何做到这一点......提前感谢您的任何建议!顺便说一句......如果有机会使用一个(长)选择语句来实现这一点,那就太好了。

4

2 回答 2

0

试试这个:

SELECT * FROM TableB WHERE userId = 1
UNION
SELECT * FROM TableA WHERE groupId = 1 
       and id not in (select id from TableB where userid = 1)
于 2012-09-06T16:57:01.117 回答
0

@rs 指出使用 UNION,这是必需的,因为 MySQL 没有 FULL 连接。

偏爱表 B 中的数据是 CASE 的选择:

select id, case when max(value_b) is not null then max(value_b) else max(value_a) end as final_value
from (
    select id, value as 'value_a', null as 'value_b' from tableA
    union
    select id, null, value from tableB
) ugh
group by 1;
于 2012-09-06T17:52:03.380 回答