2017-04-07 4 views
2

ich diese SQL-Anforderung haben, aber nicht funktioniert ... Ich weiß wirklich nicht, warum, weil ich mit SQL Anfang bin ...Multiple Inner - SQL

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' 

Danke für Ihre Hilfe

+2

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

+0

BTW, 'LIKE' ohne Platzhalter kann normalerweise durch' = 'ersetzt werden. – jarlh

+0

Es funktioniert mit dem ersten Inner Join ... aber dann mit dem zweiten funktioniert nicht – Alexandre

Antwort

2

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 
+0

Ein Fehler verhindert, dass die Abfrage funktioniert: Die "" Datenquelle erzeugt den folgenden Fehler: Die Datenquelle hat die doppelten Spaltennamen (Loc_Code) – Alexandre

+0

Nun entdeckt ON-Klauseln würden nur für äußere Joins Sinn machen, und ich habe eine Ahnung, dass das OP wirklich danach ist. –

+0

Gleicher Fehler wieder mit Or – Alexandre