Ihre select-Anweisung
Select CDR.*,
p1.*,
p2.*,
p3.*
From dbo.T_CDR_APPEL CDR
Inner Join dbo.POS As p1 On CDR.CDR_LOC_CODE = p1.Loc_Code And
CDR.CDR_LOC_CODE Like 'SC%VI%' And CDR.CDR_TYPE Like 'I%'
Inner Join dbo.POS As p2 On CDR.CDR_LAST_REDIR_NO = p2.Post_type And
CDR.CDR_LOC_CODE Like 'CCN%' And CDR.CDR_TYPE Like 'I'
Inner Join dbo.POS As p3 On CDR.CDR_LAST_REDIR_NO = p3.Backup_Number And
CDR.CDR_LOC_CODE Like 'VoiceMail%' And CDR.CDR_TYPE Like 'IF'
ist grundsätzlich die gleiche wie
SELECT CDR.*,
p1.*,
p2.*,
p3.*
FROM dbo.T_CDR_APPEL CDR
INNER JOIN dbo.POS AS p1 ON CDR.CDR_LOC_CODE = p1.Loc_Code
INNER JOIN dbo.POS AS p2 ON CDR.CDR_LAST_REDIR_NO = p2.Post_type
INNER JOIN dbo.POS AS p3 ON CDR.CDR_LAST_REDIR_NO = p3.Backup_Number
WHERE
CDR.CDR_LOC_CODE LIKE 'SC%VI%' AND
CDR.CDR_LOC_CODE LIKE 'CCN%' AND
CDR.CDR_LOC_CODE LIKE 'VoiceMail%' AND
CDR.CDR_TYPE LIKE 'I%' AND
CDR.CDR_TYPE LIKE 'I' AND
CDR.CDR_TYPE LIKE 'IF'
Also, das Problem ist die WHERE
Klausel mit vielen Kombination von Bedingungen für die gleichen Spalten CDR.CDR_LOC_CODE
und CDR.CDR_TYPE
. Ersetzen Sie stattdessen AND
durch OR
.
aktualisieren: Seit p1,p2,p3
sind von der gleichen Tabelle, um doppelte Spalten zu vermeiden, versuchen Sie diesen
SELECT CDR.*, p.* FROM
(
SELECT *,
(CASE
WHEN CDR_TYPE LIKE 'I%' THEN CDR_LOC_CODE
WHEN CDR_TYPE LIKE 'I' THEN CDR_LAST_REDIR_NO
WHEN CDR_TYPE LIKE 'IF' THEN CDR_LAST_REDIR_NO
ELSE ''
END) TMP_COL FROM dbo.T_CDR_APPEL
) CDR
INNER JOIN dbo.POS p ON
(CASE
WHEN CDR.CDR_TYPE LIKE 'I%' THEN p.Loc_Code
WHEN CDR.CDR_TYPE LIKE 'I' THEN p.Post_type
WHEN CDR.CDR_TYPE LIKE 'IF' THEN p.Backup_Number
ELSE ''
END) = CDR.TMP_COL
WHERE
(CDR.CDR_LOC_CODE LIKE 'SC%VI%' AND CDR.CDR_TYPE LIKE 'I%') OR
(CDR.CDR_LOC_CODE LIKE 'CCN%' AND CDR.CDR_TYPE LIKE 'I') OR
(CDR.CDR_LOC_CODE LIKE 'VoiceMail%' AND CDR.CDR_TYPE LIKE 'IF')
Hinweis: über die Ausführen die Abfrage kann eine Weile mit großen Tischen nehmen. Sie können der WHERE
-Klausel einige Bedingungen hinzufügen, um sie weiter abzustimmen. Außerdem sollten wir die WHERE
-Klausel in die Unterabfrage einfügen, da und CDR_TYPE
derselben Tabelle dbo.T_CDR_APPEL
entsprechen. Überprüfen Sie auch Null oder leer für die dynamische Spalte TMP_COL
, um zu vermeiden, Tabellen ON '' = ''
oder ON NULL = NULL
zu verbinden.
SELECT CDR.*, p.* FROM
(
SELECT *,
(CASE
WHEN CDR_TYPE LIKE 'I%' THEN CDR_LOC_CODE
WHEN CDR_TYPE LIKE 'I' THEN CDR_LAST_REDIR_NO
WHEN CDR_TYPE LIKE 'IF' THEN CDR_LAST_REDIR_NO
ELSE ''
END) TMP_COL FROM dbo.T_CDR_APPEL
WHERE
(CDR_LOC_CODE LIKE 'SC%VI%' AND CDR_TYPE LIKE 'I%') OR
(CDR_LOC_CODE LIKE 'CCN%' AND CDR_TYPE LIKE 'I') OR
(CDR_LOC_CODE LIKE 'VoiceMail%' AND CDR_TYPE LIKE 'IF')
) CDR
INNER JOIN dbo.POS p ON
(CASE
WHEN CDR.CDR_TYPE LIKE 'I%' THEN p.Loc_Code
WHEN CDR.CDR_TYPE LIKE 'I' THEN p.Post_type
WHEN CDR.CDR_TYPE LIKE 'IF' THEN p.Backup_Number
ELSE ''
END) = CDR.TMP_COL AND NULLIF(CDR.TMP_COL, '') IS NOT NULL
Machen Sie es in Schritten. Beginnen Sie mit der einfachen 1 Tabellenauswahl. Wenn es wie erwartet funktioniert, fügen Sie den ersten Join hinzu. Wenn es funktioniert, fügen Sie einen weiteren Join usw. hinzu. – jarlh
BTW, 'LIKE' ohne Platzhalter kann normalerweise durch' = 'ersetzt werden. – jarlh
Es funktioniert mit dem ersten Inner Join ... aber dann mit dem zweiten funktioniert nicht – Alexandre