2016-05-17 18 views
0

Ich habe eine Abfrage mit mehreren Joins, für die DOC_TYPE Spalte NULL kommt, auch wenn es einige Werte enthält. Die Abfrage ist unterSQL-Abfrage gibt kein korrektes Ergebnis zurück

SELECT 
    a.mkey, 
    c.type_desc DOC_TYPE, 
    a.doc_no INWARD_NO, 
    CONVERT(VARCHAR, a.doc_date, 103) date, 
    a.to_user, 
    a.No_of_pages, 
    Ref_No, 
    c.type_desc DEPT_RECEIVED, 
    c.type_desc EMP_RECEIVED, 
    b.first_name + ' ' + b.last_name NAME, 
    b.email 
FROM 
    inward_doc_tracking_hdr a 
LEFT JOIN 
    user_mst b ON a.to_user = b.mkey 
LEFT JOIN 
    type_mst_a c ON a.doc_type = c.master_mkey 
       AND a.dept_received = c.Master_mkey 
       AND a.emp_received = c.Master_mkey 
WHERE 
    a.to_user = '1279' 

Der doc_type Wert 428 und deren desciption ist stammt aus

select type_desc 
from type_mst_a 
where master_mkey = 428 

als Drawing aber wenn ich die Join-Abfrage betreibe ich es als NULL erhalten. Warum ??

I SQL Server 2005.

+0

Überprüfen Sie Ihre Daten, ist das letzte ON Prädikat erfüllt? – Serg

+0

@Serg: was sagst du, ich habe dich nicht? – BNN

+0

Ich meine 'a.doc_type = c.master_mkey und a..dept_received = c.Master_mkey und a.emp_received = c.Master_mkey' Prädikat, Sie sagten' a.doc_type' = 428, was ist mit 'a.dept_received' und 'a.emp_received'? – Serg

Antwort

1

Im Anschluss an die Diskussion aktuelle Version ist

SELECT 
    a.mkey, c.type_desc DOC_TYPE, a.doc_no INWARD_NO, 
    convert(varchar, a.doc_date,103) date, a.to_user, a.No_of_pages, Ref_No, d.type_desc DEPT_RECEIVED, 
    b.first_name + ' ' + b.last_name SENDER, b.first_name + ' ' + b.last_name NAME, b.email 
FROM inward_doc_tracking_hdr a 
-- LEFT ? 
JOIN user_mst b ON a.to_user = b.mkey 
JOIN type_mst_a c ON a.doc_type = c.master_mkey 
JOIN type_mst_a d ON a.dept_received = d.Master_mkey 
WHERE 
    a.to_user = '1279' 

LEFT JOIN wenn inward_doc_tracking_hdr Zeilen mit NULL-Werte erforderlich ist oder noch keine Treffer mit müssen im Ergebnis vorliegen. Hoffe, wir sind jetzt auf dem richtigen Weg.

0

Da Sie nach links ausführen bin mit beitreten, alle Bedingungen in der Join-Klausel müssen erfüllt werden Werte aus der verknüpften Tabelle zurückzukehren sonst werden sie null sein. I.e.

a.doc_type = c.master_mkey AND 
    a.dept_received = c.Master_mkey AND 
    a.emp_received = c.Master_mkey 

, wenn Sie Ihre LEFT zu einem INNER JOIN ändern JOIN, ich wette, dass Sie überhaupt Recht keine Ergebnisse erhalten?

Wenn Sie einfach eine Auswahl in beiden Tabellen durchführen, die Ihren master_mkey = 428 anzeigt, sollten Sie sehen, dass eines der Felder (a.detp_received, a.emp_received) einen anderen Wert als 428 hat und dies der Grund dafür ist eine Null bekommen.

0

Ich denke, Änderung LEFT OUTER JOIN zu INNER JOIN wird Ihr Problem lösen. (Da Sie holen doc_no aus der linken Tabelle)

SELECT a.mkey, 
      c.type_desc      DOC_TYPE, 
      a.doc_no       INWARD_NO, 
      CONVERT(VARCHAR, a.doc_date, 103) date, 
      a.to_user, 
      a.No_of_pages, 
      Ref_No, 
      c.type_desc       DEPT_RECEIVED, 
      c.type_desc       EMP_RECEIVED, 
      b.first_name + ' ' + b.last_name NAME, 
      b.email 
    FROM inward_doc_tracking_hdr a 
    INNER JOIN user_mst b 
     ON (a.to_user = b.mkey) 
    INNER JOIN type_mst_a c 
     ON (a.doc_type = c.master_mkey 
     AND a.dept_received = c.Master_mkey 
     AND a.emp_received = c.Master_mkey) 
    WHERE a.to_user = '1279' 
+0

nicht jeden Datensatz mit Ihrer Antwort zurück – BNN

0

Statt LEFT JOIN Sie haben innere beitreten, um zu verwenden, um Datensätze zu erhalten DOC_TYPE haben. Diese Abfrage wird Ihnen helfen:

SELECT a.mkey, 
     c.type_desc      DOC_TYPE, 
     a.doc_no       INWARD_NO, 
     CONVERT(VARCHAR, a.doc_date, 103)date, 
     a.to_user, 
     a.No_of_pages, 
     Ref_No, 
     c.type_desc      DEPT_RECEIVED, 
     c.type_desc      EMP_RECEIVED, 
     b.first_name + ' ' + b.last_name NAME, 
     b.email 
FROM inward_doc_tracking_hdr a 
     INNER JOIN user_mst b 
       ON a.to_user = b.mkey 
     INNER JOIN type_mst_a c 
       ON a.doc_type = c.master_mkey 
       AND a.dept_received = c.Master_mkey 
       AND a.emp_received = c.Master_mkey 
WHERE a.to_user = '1279' 
Verwandte Themen