2016-07-05 15 views
0

Zum ersten Mal treffen sie hier eine Frage veröffentlichen, sondern ein Ich bin ein häufiger Benutzer dieser Webseite, vielen Dank im Voraus zu dieser Gemeinschaft, die großen Antworten haben Fragen zu verschleiern.Convert nur, wenn Kriterien in der Mitte ein Join

Unten ist ein Mitglied werden, dass das Datum auf zwei Ansichten konvertiert, die dazu führt, ~ 20 Millionen Termine im „PDR“ Ansicht neu formatiert zu werden. Ich kann nur das Jahr und den Monat im Join verwenden, weshalb es konvertiert wird (ich habe keine Option für diesen Teil).

Ich brauche nur die Daten in diesen Spalten enthalten IF Department_Code = ‚X‘ so 90% der resultierenden ~ 500 Zeilen dieses letzten Rollup wird nichts in diesen Spalten.

ich diese effizienter zu machen brauchen, würde Ich mag das Datum sagen konvertieren nur, wenn die Department_Code = ‚X‘

Kann ich diese Kriterien zu einem Join hinzufügen?

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
= Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 
+0

die RDBMS? Anstatt in ein varchar zu konvertieren, können Sie die Datumsumrechnungen als mathematisch halten, indem Sie sowohl YEAR (Datum) = YEAR (Datum) als auch MONTH() = MONTH() verknüpfen. Das könnte etwas Leistung bringen. Ansonsten können Sie eine case-Anweisung schreiben, wie Sie wollen, und sagen, wenn die case-Anweisung = 1 ist, dann schließen Sie sich an. Z.B. (CASE WHEN department_cod = 'X' und MONAT (a) = MONAT (b) und YEAR (a) = YEAR (b) THEN 1 ELSE 0 END) = 1 – Matt

Antwort

0

ich diese effizienter zu machen brauchen, würde ich das Datum nur, wenn die Department_Code = ‚X‘

bin ich in der Lage zu sagen, konvertieren hinzufügen, dass Kriterien ein Mitglied werden?

Da die konvertierten Daten in Ihrer [links] Joinbedingung verwendet werden, nehme ich an, dass die Umwandlung mit Department_Code verschiedenen Reihen bedeutet die Vermeidung von 'X' wird (aus diesem Grunde), um die Join-Bedingung nicht erfüllen.

Wenn die Department_Code Spalte auf SLHSV_TM_Pharm_IP_OP_Factor_Rollup ist, dann ist die einfachste Sache zu tun wäre, um die Join-Bedingung zu schreiben wie folgt:

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
    on TMIPOP.[Department_Code] = 'X' 
    and Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
    = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 

Ihre Anfrageplaner dann könnte vermeiden, dass die rechte Seite des AND Auswertung wenn die linke Seite false ergibt. Es ist erlaubt, dies zu tun, aber ob dies tatsächlich der Fall ist, hängt von der Implementierung ab.

Wenn Sie sicher sein wollen, dann können Sie die Innentabellenzeilen Vorfilters Sie nicht wollen:

Left Join (
    select * 
    from [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] 
    where [Department_Code] = 'X' 
) as TMIPOP 
    on Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
    = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 

Wenn die Department_Code Spalte statt auf dem Tisch ist PDR, dann sind Ihre Wahl begrenzt, sollte aber das funktioniert (und sollte ein analoges arbeiten, wenn diese Spalte auf der anderen Tabelle):

Left Join [dbo].[SLHSV_TM_Pharm_IP_OP_Factor_Rollup] as TMIPOP 
    on case 
    when PDR.[Department_Code] = 'X' 
     then Left (Convert (varchar, TMIPOP.[Pharm_IPOP_MONTH], 112),6) 
     = Left (Convert (varchar, PDR.Payroll_Period_End_Date, 112),6) 
    else 1 = 0 
    end 

Es ist denkbar, dass Sie das letzte teurer als nur tun, alle Umwandlungen finden würden. Da Leistung hier offensichtlich Ihr Anliegen ist, ist es wichtig zu testen. Es ist auch ratsam, Abfragepläne für die von Ihnen bewerteten Optionen zu prüfen, da dies Ihnen helfen kann, Variationen zu finden, die besser funktionieren.

+0

Es sieht immer offensichtlich, nachdem Sie es sehen. Ich versuche es jetzt und lasse es ein wenig laufen. Hoffe, dass es das tut. Ich werde mit den Ergebnissen antworten. Vielen Dank! Linke Verbindung ( Wählen Sie * von [dbo]. [SLHSV_TM_Pharm_IP_OP_Factor_Rollup] wo [Abteilung_Code] = 'X' ) als TMIPOP –