2016-10-31 88 views
1

我對此SQL查詢使用第三方軟件,它具有各種限制,其中一個限制爲1,000個字符。我已經創建了一些代碼,用於瀏覽註冊到特定帳戶的聯繫人號碼列表,並創建了專門爲此任務創建的視圖。我目前的腳本(見下文)有效,但帶回了重複的響應。我想縮短代碼的長度,並只選擇Distinct響應。減少我的SQL代碼的長度

作爲背景,CRM系統,這是掛有多個地方有人可以留下聯繫電話,所以我需要的代碼,以消除任何重複時,它顯示的響應。當前的代碼不會嘗試刪除重複由於上述字符的限制,它是:

SELECT [Contact_Mobile_Phone] AS V, [Contact_Mobile_Phone] AS D 
FROM [DatabaseName] 
WHERE MAINLKUPID = '{Import.TenantID}' AND [Contact_Mobile_Phone] IS NOT NULL 
UNION ALL 
SELECT [Contact_Home_Phone] AS V, [Contact_Home_Phone] AS D 
FROM [DatabaseName] 
WHERE MAINLKUPID = '{Import.TenantID}' AND [Contact_Home_Phone] IS NOT NULL 
UNION ALL 
SELECT [Contact_Work_Phone] AS V, [Contact_Work_Phone] AS D 
FROM [DatabaseName] 
WHERE MAINLKUPID = '{Import.TenantID}' AND [Contact_Work_Phone] IS NOT NULL 
UNION ALL 
SELECT [Group_Home_Phone] AS V, [Group_Home_Phone] AS D 
FROM [DatabaseName] 
WHERE MAINLKUPID = '{Import.TenantID}' AND [Group_Home_Phone] IS NOT NULL 
UNION ALL 
SELECT [Group_Mobile_Phone] AS V, [Group_Mobile_Phone] AS D 
FROM [DatabaseName] 
WHERE MAINLKUPID = '{Import.TenantID}' AND [Group_Mobile_Phone] IS NOT NULL 
UNION ALL 
SELECT [Contact_Home_Phone] AS V, [Contact_Home_Phone] AS D 
FROM [DatabaseName] 
WHERE [Group_ID] = '{Script.V1}' AND [Contact_Home_Phone] IS NOT NULL 
UNION ALL 
SELECT [Contact_Mobile_Phone] AS V, [Contact_Mobile_Phone] AS D 
FROM [DatabaseName] 
WHERE [Group_ID] = '{Script.V1}' AND [Contact_Mobile_Phone] IS NOT NULL 
UNION ALL 
SELECT 'Enter other number' AS V, 'Enter other number' AS D 

正如你所看到的,它不是最優雅的事情我已經編碼。我想它的樣子,是與此類似:

SELECT DISTINCT ([Contact_Mobile_Phone], [Contact_Home_Phone], [Contact_Work_Phone], [Group_Home_Phone], [Group_Mobile_Phone]) V, 
([Contact_Mobile_Phone], [Contact_Home_Phone], [Contact_Work_Phone], [Group_Home_Phone], [Group_Mobile_Phone]) D 
FROM [DatabaseName] 
WHERE MAINLKUPID = '{Import.TenantID}' AND ([Contact_Mobile_Phone], [Contact_Home_Phone], [Contact_Work_Phone], [Group_Home_Phone], [Group_Mobile_Phone]) IS NOT NULL 
AND MAINLKUPID = '{Import.TenantID}' AND ([Contact_Mobile_Phone], [Contact_Home_Phone], [Contact_Work_Phone], [Group_Home_Phone], [Group_Mobile_Phone]) IS NOT NULL 

的標準是,它需要顯示在兩列V和D.相同的結果,它需要不通過空數據拉,它每個列只需輸入一次,即使它們最初來自不同的列。我知道我理想的代碼的語法是不對的,希望有人能指出我正確的方向。提前致謝。

+5

刪除重複項是改變一個簡單的事情將工會全部交給工會。 –

+0

我已經閱讀過幾次,每次閱讀它時,我都更加困惑於你實際需要的東西。但正如@DanBracuk已經提到的那樣,刪除重複內容很簡單。 –

+0

您可以添加示例數據,並向我們展示您期望的輸出? –

回答

0

爲什麼不把代碼放在存儲過程中,只需調用「EXEC my_stored_procedure;」?那會更短!

+0

我同意!但是,我無法訪問此功能,我只能訪問此有限的第三方軟件。我們的IT部門目前也是一個非常緊張的資源,所以試圖找到我可以實施的最佳解決方案來幫助他們。 –

0

你能解釋一下爲什麼你要兩次選擇相同的列,但給它不同的名字?也許你打算第一個是一個描述。如果是這樣,它應該在單引號不是方括號 - 但這會影響重複消除。

您可以執行以下操作來刪除重複項:

  • 更換UNION ALLUNION

您可以執行以下操作,以減少大小:

  • 刪除所有方括號
  • 刪除as Vas D來自所有,但第一個查詢

如果這還不夠短,然後取出NULL比較和查詢的結構爲:

select * 
from (<your query here with no null comparisons and `union` instead of `union all`) x 
where d is not null; 
+0

感謝您的建議。我使用的第三方軟件需要有一個顯示字段和一個值字段,因此V和D.顯示字段將向最終用戶顯示可供選擇的數字,然後系統使用值字段進行選擇數據轉發到腳本的其餘部分。我希望這是有道理的。 –

+0

@CraigJones你可以將每個'select'的列副本移動到外部'select'中:'將N選擇爲V,將N選擇爲D(將[Contact_Mobile_Phone]選擇爲N from ... union ...)作爲X '? – HABO

0
select phone_num as V,phone_num as D 
from [DatabaseName] unpivot (phone_num for phone_type in ([Contact_Mobile_Phone],[Contact_Home_Phone],[Contact_Work_Phone],[Group_Home_Phone],[Group_Mobile_Phone])) u 
where MAINLKUPID = '{Import.TenantID}' 
union 
select phone_num as V,phone_num as D 
from [DatabaseName] unpivot (phone_num for phone_type in ([Contact_Home_Phone],[Contact_Mobile_Phone])) u 
WHERE [Group_ID] = '{Script.V1}' 
union all 
SELECT 'Enter other number','Enter other number'