3 つのテーブルがあり、それぞれに 2 行しかありません。T1 (id、名前)、T2 (id、電子メール)、T3 (id、電話)。T1 には id1 と id2 の両方に登録があり、T2 には id1 にのみ登録があり、id2 には電子メールでの登録がありません (null)。T3 には、id1 と id2 の両方に登録があります。T1、T2、T3 をいくつかの条件 ('% etc %' のような名前) で結合したい。結果は (name, email, phone) を含むテーブルになるはずですが、結合されたテーブルのいずれかの登録が NULL の場合 (例: T2 id2(email) が NULL)、結果を (name のみのテーブルにしたい) , phone)(T2 は id2 に null 登録があるため、T1+T3)...列に NULL 以外の登録がある場合、複数の内部結合に何らかの種類があります。ありがとうございました。
質問する
230 次
1 に答える
0
私はあなたが使用を検討する必要があると思いますLEFT JOINs
:
SELECT T1.Name, T2.Email, T3.Phone
FROM T1
LEFT JOIN T2 ON T1.id=T2.id
LEFT JOIN T3 ON T1.id=T3.id
これにより、テーブルT1からすべてのレコードが返され、T2とT3から一致するレコードのみが返されます。他のフィールドはNULLになります。
ただし、基準に一致するものだけが必要な場合は、代わりに内部結合を使用してください。
SELECT T1.Name, T2.Email, T3.Phone
FROM T1
INNER JOIN T2 ON T1.id=T2.id
INNER JOIN T3 ON T1.id=T3.id
これにより、一致するレコードのみが返されます。
1つのレコードがNULLの場合に2列のみを返すことについてのコメント-それはあなたが採用したいアプローチではないと思います。すべての列を返し、これをプレゼンテーション側で処理します。本当に動的列が必要な場合は、動的SQLの使用を検討する必要があります。
- 編集 -
動的SQLアプローチ:
SET @id = 2;
SET @sql = NULL;
SELECT
CONCAT(
CASE WHEN EMail IS NOT NULL THEN 'Email' ELSE '' END,
CASE WHEN EMail IS NOT NULL AND Phone IS NOT NULL THEN ',' ELSE '' END,
CASE WHEN Phone IS NOT NULL THEN 'Phone' ELSE '' END)
INTO @sql
FROM T1
LEFT JOIN T2 ON T1.id=T2.id
LEFT JOIN T3 ON T1.id=T3.id
WHERE T1.Id = @id;
SET @sql = CONCAT('SELECT Name, ', @sql, '
FROM T1
LEFT JOIN T2 ON T1.id=T2.id
LEFT JOIN T3 ON T1.id=T3.id
WHERE T1.Id = ',@id);
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-03-02T17:25:32.283 に答える