2016-10-31 2 views
1

ich für diese SQL-Abfrage einer Software von Drittanbietern bin mit den verschiedenen Einschränkungen, einen eine Zeichenbegrenzung von 1000 Zeichen sein. Ich habe einen Code erstellt, der eine Liste von Kontaktnummern durchsucht, die für einen bestimmten Account registriert sind, und eine speziell für diese Aufgabe erstellte Ansicht erstellt hat. Mein aktuelles Skript (siehe unten) funktioniert, bringt jedoch doppelte Antworten zurück. Ich möchte die Länge des Codes verkürzen und nur für eindeutige Antworten auswählen.die Länge meines SQL-Code Reduzierung

Als Hintergrund das CRM-System dies verknüpft ist, hat mehrere Orte jemand eine Telefonnummer hinterlassen, also muss ich den Code Duplikate entfernen, wenn er die Antwort anzeigt. Der aktuelle Code wird nicht versucht, Duplikate zu entfernen aufgrund der oben genannten Art zu begrenzen, ist es:

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 

Wie Sie sehen, es ist nicht das eleganteste, was ich codiert haben. Was ich will, es so aussieht, ist etwas ähnlich wie diese:

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 

Die Kriterien sind, dass es die gleichen Ergebnisse sowohl in der Spalte V und D. Es muss angezeigt werden muss, nicht durch Null-Daten ziehen, und es Sie müssen nur jede Nummer einmal in jede Spalte eingeben, auch wenn sie ursprünglich aus verschiedenen Spalten stammen. Ich bin mir bewusst, dass die Syntax für meinen idealen Code nicht stimmt, in der Hoffnung, dass jemand mich in die richtige Richtung weisen kann. Danke im Voraus.

+5

die Duplikate ist einfach eine Frage der Veränderung der aus- "Gewerkschaft alle zu Gewerkschaft". –

+0

Ich habe dies mehrmals gelesen und jedes Mal, wenn ich es lese ich bin mehr verwirrt durch das, was Sie eigentlich hier wollen. Aber wie bereits erwähnt @DanBracuk ist das Entfernen der Duplikate einfach. –

+0

Können Sie Beispieldaten hinzufügen und uns die Ausgabe zeigen, die Sie erwarten würden? –

Antwort

0

Warum Sie in einer gespeicherten Prozedur setzen Sie den Code nicht und rufen Sie einfach „EXEC my_stored_procedure;“? Das wäre viel kürzer!

+0

Ich stimme zu! Ich habe jedoch keinen Zugriff darauf, ich habe nur Zugriff auf diese eingeschränkte Software von Drittanbietern.Unsere IT-Abteilung ist derzeit auch eine sehr gestreckte Ressource, also versuchen Sie, die beste Lösung zu finden, die ich implementieren kann, um ihnen zu helfen –

0

Können Sie erklären, warum Sie die gleiche Spalte zweimal auswählen, aber es verschiedene Namen zu geben? Vielleicht beabsichtigen Sie, dass die erste eine Beschreibung ist. Wenn dies der Fall ist, sollte es in einfachen Anführungszeichen stehen, nicht in eckigen Klammern. Dies wirkt sich jedoch auf die doppelte Eliminierung aus.

können Sie folgendermaßen vorgehen um Duplikate zu entfernen:

  • Ersetzen Sie die UNION ALL mit UNION

Sie können wie folgt vorgehen um die Größe zu reduzieren:

  • Entfernen Sie alle eckigen Klammern
  • entfernen as V und as D von allen außer der ersten Abfrage

Wenn das nicht kurz genug ist, dann entfernen Sie den NULL Vergleich und strukturiert die Abfrage wie:

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

Danke für den Rat. Die Fremdsoftware, die ich verwende, muss ein Anzeigefeld und einen Wert haben, also V und D. Das Anzeigefeld zeigt dem Endbenutzer, welche Nummern zur Auswahl stehen, das System verwendet dann das Wertfeld, um das ausgewählte auszuwählen Daten weiter in den Rest des Skripts. Ich hoffe, das ergab einen Sinn. –

+0

@CraigJones können Sie die Spaltenverdopplung aus jedem 'select' in ein äußeres' select' verschieben: 'wählen Sie N als V, N als D von (wählen Sie [Contact_Mobile_Phone] als N von ... union ...) als 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' 
Verwandte Themen