0

私は次の3つのテーブルを持っています:

表 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-association に使用されるため、両方のテーブルの「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

誰かがこれを行う方法を知っていることを願っています...提案を事前にありがとう! ところで...単一の(長い)selectステートメントを使用してこれを実現する機会があれば素晴らしいでしょう。

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 は、MySQL には FULL 結合がないため必要な UNION の使用を指摘しています。

CASE では、テーブル B のデータを優先することが選択されています。

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 に答える