3

条件付き結合を検索しましたが、私が試みていることとは異なることをしようとしているようです。質問のために問題を少し単純化します。

私は3つのテーブルを持っています:Users, Clients, and Employees.

テーブルには 2 つのUsers列があり、AssociatedID and UserType.

UserTypeまたはandは Clients または Employees テーブルの対応する ID です"Client""Employee,"AssociatedID

問題は、クライアントと従業員の両方が ID に整数を使用するため、各テーブルがまったく異なるものに対して同じ ID を持つ可能性があることです (この問題を回避する GUID とは対照的に)。

私が欲しいのは、Users の行を見て、UserType が Employee の場合は Employees テーブルの ID に JOIN AssociatedID を、UserType が Client の場合は Clients テーブルの ID に JOIN AssocaitedID を返すクエリです。したがって、Clients と Employees の両方に Name 列がある場合、クライアントか従業員かに関係なく、各ユーザーの名前をすべて取得できます。ここで違いが生じる場合は、SQL Server 2008 R2 を使用しています。

4

2 に答える 2

8

これを試して:

SELECT 
  COALESCE(c.Name, e.Name) AssociatedName,
  ... 
FROM Users u
LEFT JOIN Clients c    ON u.AssociatedID = c.ClientId
                      AND u.UserType     = 'Client'
LEFT JOIN Employees e  ON u.AssociatedID = e.EmployeeId
                      AND u.UserType     = 'Employee';

SQL フィドルのデモ

または: @Tikkesが指摘したように、次UNIONのようにしてこれを行うことができます:

SELECT c.Name AssociatedName
FROM Users u
INNER JOIN Clients c    ON u.AssociatedID = c.ClientId
                      AND u.UserType     = 'Client'
UNION ALL
SELECT e.Name FROM Users u
INNER JOIN Employees e  ON u.AssociatedID = e.EmployeeId
                      AND u.UserType     = 'Employee';

更新された SQL Fiddle デモ


更新:CASEこれには、次のような式を使用する必要があります。

SELECT 
  u.AssociatedID,
  CASE u.UserType 
   WHEN 'Client' THEN c.Name
   ELSE e.Name 
  END AS AssociationName
FROM Users u
LEFT JOIN Clients c    ON u.AssociatedID = c.ClientId      
LEFT JOIN Employees e  ON u.AssociatedID = e.EmployeeId;

CASE を使用した SQL Fiddle デモの更新

于 2013-01-09T07:42:05.230 に答える