2010-06-16 61 views
1

我需要的,如果存在返回行,如果不返回的傳遞價值之一是NOT EXISTS EXISTS:SQL服務器不能從多個表

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 Queries來查找哪個不存在。有更好的方法嗎?提前致謝。

+2

我不明白你怎麼能確定哪一個是錯的。如果他們通過一個有效的員工,一個有效的部門和一個有效的城市,但他們並不都是有效的。你怎麼知道哪一個(或多個)是「不正確的」? – 2010-06-16 14:53:32

+0

我假定OP意味着這3個值中的一個或多個不存在。 *錯誤*可能不是描述它的正確方法:或許*未找到*會更好。 – MJB 2010-06-16 16:52:13

+0

MJB - 根據您的意見編輯(不存在) – 2010-06-16 17:14:36

回答

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行,但它仍然是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