2015-08-18 48 views
1

數據庫結構返回所有行是否連接表不包含任何行,否則返回唯一匹配的行

CREATE TABLE SalesOrder 
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Reference NVARCHAR(50) NOT NULL DEFAULT '', 
    CustomerID INT NOT NULL DEFAULT 0 
); 
CREATE NONCLUSTERED INDEX IX_SalesOrder_CustomerID ON SalesOrder (CustomerID); 

CREATE TABLE Customer 
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    Name NVARCHAR(50) NOT NULL DEFAULT '' 
); 

實施例:SQL Fiddle

表值可變@SelectedCustomers可以是由選定的客戶的ID的空或包含列表用戶。如果選擇列表爲空

SELECT so.ID 
, so.Reference 
, c.Name AS CustomerName 
FROM SalesOrder so 
INNER JOIN Customer c ON c.ID = so.CustomerID 
WHERE so.CustomerID IN (SELECT ID FROM @SelectedCustomers) 

但我需要返回所有行,如果變量爲空
我試過OR關鍵字,但這種方法是不是指數
選定的客戶該查詢返回的訂單,並且沒有返回友好和查詢變得非常緩慢。

目前我生成應用程序的代碼(.NET)查詢。
如果列表中包含一些值,然後
WHERE so.CustomerID IN (SELECT ID FROM @SelectedCustomers)條款添加到查詢

問題:是否存在以獲得所需結果更有效的方式一些其他的方式?

+0

一種方法是使用if-else。檢查從@SelectedCustomers計數(*)是否0,然後使用where子句查詢,否則使用不帶where子句的查詢。您可能需要自己進行基準測試 – whereisSQL

+0

爲什麼您需要在單個SQL查詢中執行此操作?難道你不能在調用代碼中檢查變量,並且如果變量爲空則執行一個sql語句,如果變量不是則執行另一個不同的查詢? – John

+0

這正是我現在正在做的(我在問題中提到過) - 在應用程序(調用)代碼 – Fabio

回答

1

不一樣
因爲這會如果@SelectedCustomers具有值但不匹配,則返回

SELECT so.ID 
    , so.Reference 
    , c.Name AS CustomerName 
FROM SalesOrder so 
INNER JOIN Customer c ON c.ID = so.CustomerID 
LEFT JOIN @SelectedCustomers s on so.CustomerID = s.ID 
WHERE s.ID is null 

工會可能工作

SELECT so.ID 
    , so.Reference 
    , c.Name AS CustomerName 
FROM SalesOrder so 
JOIN Customer c ON c.ID = so.CustomerID 
JOIN @SelectedCustomers on so.CustomerID = @SelectedCustomers.ID 
union 
SELECT so.ID 
    , so.Reference 
    , c.Name AS CustomerName 
FROM SalesOrder so 
JOIN Customer c ON c.ID = so.CustomerID 
where (select top 1 ID from @SelectedCustomers) is null 

或者我知道這聽起來很瘋狂,但如果在@SelectedCustomers沒有行然後將所有不同的ID。你離開了或。

+0

第一個查詢將不起作用,因爲始終返回所有訂單(行)。使用'UNION'的第二個查詢似乎有效。但我使用'WHERE NOT EXISTS(SELECT * FROM @SelectedCustomers)'而不是'SELECT TOP 1'。我從第二個查詢中刪除了一些語法錯誤 – Fabio

+0

您的歡迎? – Paparazzi

+0

:)這行'JOIN @SelectedCustomers就這樣。CustomerID = @ SelectedCustomers.ID'將產生錯誤_必須聲明標量變量「@SelectedCustomers」._添加別名後工作正常。 – Fabio

0

添加到WHERE語句的where結束:

或者@selectedcustomer是空

+0

中生成所需查詢OP已嘗試「OR ...」並正在尋找更高性能的東西。 –

+0

'@SelectedCustomers IS NULL'條件將無法工作,因爲'@ SelectedCustomers'是表值型 – Fabio

+0

或(SELECT COUNT *從@SelectedCustomers)= 0 –

0

不知道,但是這可能工作:

SELECT so.ID 
    , so.Reference 
    , c.Name AS CustomerName 
FROM SalesOrder so 
INNER JOIN Customer c ON c.ID = so.CustomerID 
INNER JOIN @SelectedCustomers s on c.ID = COALESCE(s.ID, c.ID) 
+0

如果'@ SelectedCustomers'爲空,則此查詢不返回行 – Fabio

相關問題