2010-06-16 3 views
1

мне нужно возвращать строки, если существует, если не вернуть, который один из переданного значения НЕ СУЩЕСТВУЕТ:SQL Server НЕ СУЩЕСТВУЕТ из более чем одной таблицы

DECLARE @INPUT1 BIGINT 
DECLARE @INPUT2 BIGINT 
DECLARE @INPUT3 BIGINT 

SELECT e.Name, d.Name, c.Name 
    FROM Employee e 
    JOIN Department d ON e.DeptID = d.DeptID 
    JOIN City c ON e.CityID = c.CityID 
WHERE 
    e.EmpID = @INPUT1 
    AND d.DeptID = @INPUT2 
    AND c.CityID = @INPUT3 

В приведенном выше SQL, все входы INPUT1, INPUT2, INPUT3 правильно передаются, возвращает строку. Если НЕ, мне нужно найти, какой INPUTx ошибочен. Я знаю, что могу написать 3 разных запроса Exists, чтобы найти, какой из них НЕ существует. Есть ли лучший подход? Заранее спасибо.

+2

Я не понимаю, как вы можете точно знать, какой из этих ошибок. Что делать, если они передают действительный сотрудник, действительный отдел и действительный город, но они не все действуют вместе. Откуда вы знаете, какой из них (или более) был «неправильным»? –

+0

Я исходил из предположения, что OP означает, что 1 или более из этих трех значений не существует. * Неверно *, вероятно, не самый правильный способ описать это: возможно, * не найдено * было бы лучше. – MJB

+0

MJB - Редактировано на основе вашего комментария (не существует) –

ответ

0

Вы не можете использовать (внутреннее) соединение, потому что это устранит те записи, которые не совпадают. Поэтому вам придется использовать внешнее соединение. Учитывая это, скорее всего, будет быстрее использовать 3 запроса. На самом деле, 4, потому что вам нужно 3, чтобы проверить 3 значения, затем еще один, чтобы вернуть тот, который вы хотите, если он существует.

Вы могли бы сделать что-то вроде этого:

SELECT 'Employee Exists' as Result from Employee where EmpId = @INPUT1 
union 
SELECT 'Department Exists' from Department where DeptId = @INPUT2 
union 
SELECT 'City Exists' from City where CityId = @INPUT3 

, чтобы показать, какие из них не существует, а затем вернуть то, что делает с запросом у вас есть. И я думаю, вы могли бы объединить это в 3 столбца вместо трех строк, но все равно было бы 3 запроса.

0

Точная логика, которая вам нужна, неясна, но эта конструкция применяет фильтр как производную таблицу, и вы можете присоединиться к ней. Так что если d.Name isnull, то нет соответствия на @ INPUT2

DECLARE @INPUT1 BIGINT, @INPUT2 BIGINT, @INPUT3 BIGINT 

SELECT 
    @INPUT1 AS NotThereIf_eName_IsNull, 
    @INPUT2 AS NotThereIf_dName_IsNull, 
    @INPUT3 AS NotThereIf_cName_IsNull, 
    e.Name, d.Name, c.Name 
FROM 
    (SELECT @INPUT1 AS EmpID, @INPUT2 AS DeptID, @INPUT3 AS CityID) dummy 
    LEFT JOIN 
    Employee e ON dummy.EmpID = e.EmpID 
    LEFT JOIN 
    Department d ON dummy.DeptID = d.DeptID AND e.DeptID = d.DeptID 
    LEFT JOIN 
    City c ON dummy.CityID = c.CityID AND e.CityID = c.CityID 
Смежные вопросы