2016-10-31 3 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 V 및을 삭제하십시오. 그만큼 짧은없는 경우 첫 번째 쿼리를 제외한 모든에서

, 다음 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'