2014-09-17 5 views
0

Я хочу сделать SQL для инструкции типа «Я», и я не могу обойти ее.TSQL - для каждого подобного заявления

Если мой TABLE_A выглядит так:

[dbo].[TABLE_A](
    [EmpID] [INT], 
    [FName] [varchar](50) NULL, 
    [LName] [varchar](50) NULL 
) 

... и мой TABLE_B выглядит следующим образом:

[dbo].[TABLE_B](
    [EmployeeActivity] [varchar](50) NULL, 
    [EmpID] [INT] 
) 

Может кто-то помочь мне написать запрос, чтобы сделать что-то вроде это:

FOR EACH DISTINCT [EmployeeActivity] RETURN 
    [TABLE_B].[EmployeeActivity], 
    [TABLE_A].[FName], 
    [TABLE_A].[LName], 
    [TABLE_A].[EmpID], 
    CASE 
    WHEN ([TABLE_B].[EmployeeActivity] IS NULL) THEN ('NO') 
    ELSE 'YES' 
    END 

Результаты должны выглядеть следующим образом:

FireDrill12, Bill, Jones, 342,YES 
FireDrill13, Bill, Jones, 342,NO 
FireDrill14, Bill, Jones, 342,YES 
FireDrill12, Smith, Sue, 253,NO 
FireDrill13, Smith, Sue, 253,NO 
FireDrill14, Smith, Sue, 253,YES 

Я не могу обдумать это.

Спасибо за любую помощь,

Аллен

+1

Ваше заявление FOR EACH ... не является надлежащей спецификацией того, что вы хотите. Таблица примеров результатов выглядит так, как будто вам нужен простой JOIN !? –

+0

И пример данных не имеет смысла. EmployeeActivity в первом столбце никогда не является нулевым, поэтому вы не увидите NO в последнем столбце. Чтобы развернуть предыдущий комментарий, вам понадобится инструкция SELECT с INNER JOIN. –

ответ

0

Другая версия с использованием inner присоединиться, но более правильный вариант использования left присоединиться как показано @Blam

SELECT 
    A.*, 
    CASE 
     WHEN B.EmployeeActivity IS NULL THEN 'No' 
     ELSE 'Yes' 
    END 
FROM 
[dbo].[TABLE_A] A 
INNER JOIN [dbo].[TABLE_B] B ON (A.EmpID = B.EmpID) 
UNION 
SELECT 
    A.*, 
    'No' 
FROM 
[dbo].[TABLE_A] A 
WHERE 
A.EmpID NOT IN (SELECT B.EmpID FROM [dbo].[TABLE_B] B) 
0

SQL является язык, основанный набор в любом случае, так что это уже делает ваш «друг», так что в теории вы могли бы сделать CROSS JOIN, чтобы каждый комбинация с корреляцией запроса, чтобы сделать ваш чек, поэтому, возможно, что-то вроде:

SELECT DISTINCT 
      b.EmployeeActivity, 
      a.FName, 
      a.LName, 
      a.EmpId, 
      CASE 
       WHEN EXISTS (SELECT 1 FROM [TABLE_B] c WHERE c.[EmployeeActivity] = b.EmployeeActivity AND c.EmpId = a.EmpId) THEN 'YES' 
       ELSE 'NO' 
      END 

FROM  Table_b AS b 

CROSS JOIN Table_a AS a 
    ON  a.EmpId = b.EmpId 
1
SELECT DISTINCT 
     [TABLE_A].[EmpID], [TABLE_A].[FName], [TABLE_A].[LName] 
    , CASE 
      WHEN [TABLE_B].[EmployeeActivity] IS NULL THEN 'No' 
      ELSE 'Yes' 
     END AS [EmployeeActivity] 
    FROM [TABLE_A] 
    LEFT JOIN [TABLE_B] 
    ON [TABLE_B].[EmpID] = [TABLE_A].[EmpID]