1

(ID、値) を含む 2 つのテーブルがあります。ID は、いずれかまたは両方のテーブルで見つかる場合があります。すべての一意の ID とその値を含むレコードセットが必要です。ID が両方のテーブルにある場合は、テーブル 2 の値が必要です。

現在、私はこのクエリを持っています:

SELECT * FROM
(SELECT * FROM table2 UNION SELECT * FROM table1) as temp
GROUP BY id

これはうまくいくようです。でも -

  1. ID が両方のテーブルにある場合、これは table2 から値を返すことが保証されていますか?

  2. そうでない場合は、どうすればよいですか?

  3. いずれにせよ、それを行うためのより良い方法はありますか?

4

2 に答える 2

0

私の2セントを入れます

SELECT ISNULL(TB2.Id, TB1.Id) As Id,
       ChooseValue(TB2.Id, TB2.Value, TB1.Values) As Value
FROM TABLE2 AS TB2
FULL OUTER JOIN TABLE1 AS TB1
ON TB2.Id = TB1.Id

これにより、コストがかかる可能性のある、テーブルまたはgroupby句を介した追加の結合または追加の実行のコストを回避できます。

CREATE FUNCTION ChooseValue(DeciderValue IN VAR_TYPE, Table_2Value IN VARTYPE, Table_1Value  IN VARTYPE)
RETURNS VARTYPE
BEGIN
    DECLARE returnValue VARTYPE;
    IF DeciderValue IS NULL THEN
        returnValue = Table_2Value
    ELSE
        returnValue = Table_1Value
    END IF
RETURN returnValue
END
于 2012-12-07T07:15:16.817 に答える
0

これを試してみてください。

SELECT  a.*
FROM    
        (
            SELECT *, 1 AS TB FROM table1  -- assuming you have many columns
            UNION ALL
            SELECT *, 2 AS TB FROM table2
        ) a INNER JOIN
        (
            SELECT ID, MAX(TB) maxTB
            FROM 
            (
                SELECT ID, 1 AS TB FROM table1
                UNION ALL
                SELECT ID, 2 AS TB FROM table2
            ) s
            GROUP BY ID
        ) b ON  a.ID = b.ID AND 
                a.tb = b.maxTB
于 2012-12-06T23:48:02.553 に答える