1

列 (この時点では、その列でどのような値がどのように使用されているかを変更することはできません) が同じ値を使用していない場所で結合する必要がある 2 つのテーブルがあります。したがって、最初のテーブルの列の値に応じて、2 番目のテーブルで特定の値を結合/選択する必要があります。これが私がやろうとしていることの例です(明らかにうまくいきません):

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
CASE
WHEN Alert.ObjectType = 'U' THEN Comments.ObjectType = 'USER'
WHEN Alert.ObjectType = 'E' THEN Comments.ObjectType = 'EVENT'
END CASE

そのため、Alert テーブルのすべてが必要であり、Comments テーブルに対応するレコードがあれば、それらも必要です。ただし、適切な/一致する ObjectType の場合のみ。

CASE と IF の両方を使用してこれを試しましたが、うまくいかないようです。このようなことは可能ですか?

4

3 に答える 3

4

CASEステートメントは、操作を実行するためではなく、値を返すため作成されます。

また、最後END CASEを just に変更しENDます。

その戻り値を使用して、結合条件で比較します。

試す:

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Comments.ObjectType = 
CASE Alert.ObjectType
WHEN 'U' THEN 'USER'
WHEN 'E' THEN 'EVENT'
END
于 2012-05-09T20:00:47.553 に答える
0

これを UNION で処理することをお勧めします。1 つのユニオンで、ユーザー コメントを別のイベント コメントに結合します。

SELECT Alert.*, userComments.Comment
FROM alert
LEFT OUTER JOIN comments usercomments ON userComments.ObjectId = Alert.ObjectId AND usercomments.objecttype='USER'
WHERE alert.objecttype = 'U'
UNION
SELECT Alert.*, eventComments.Comment
FROM alert
LEFT OUTER JOIN comments eventcomments ON eventComments.ObjectId = Alert.ObjectId AND eventcomments.objecttype='EVENT'
WHERE alert.objecttype = 'E'

私のようにエイリアスを付ける必要はありません。読みやすくするだけです。

于 2012-05-09T20:09:11.180 に答える
0

それだけではない理由:

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Alert.ObjectType = LEFT(Comments.ObjectType, 1);

それははるかに単純なようです...

編集

あなたのコメントに基づいて、すべての「一致する」値が同じ文字で始まるわけではないようです。この場合、列 AlertType char(1) と CommentType varchar(50) を持つ中間テーブルを設計することをお勧めします。U、User など、TypeId の各組み合わせを挿入します。E、イベント。など。SQLを変更して読み取ることができます

SELECT Alert.*, Comments.Comment FROM
Alert
LEFT OUTER JOIN Intermediate i on Alert.ObjectType = i.AlertType
LEFT OUTER JOIN Comments ON Comments.ObjectId = Alert.ObjectId AND
Comments.ObjectType = i.CommentType;
于 2012-05-09T20:02:54.800 に答える