2017-06-12 1 views
0

Ich habe eine Abfrage geschrieben, um diese Datensätze aus der Tabelle Works auszuwählen, die auch in der Tabelle WorkOrder vorhanden ist. Das ist cool, aber jetzt möchte ich die Datensätze auswählen, die in Works vorhanden sind, aber nicht in WorkOrders.Warum funktioniert meine innere Join-Abfrage mit! = Nicht?

Ich habe diese Abfrage geschrieben, aber diese gibt falsche Ergebnisse zurück.

Select w.NIT_No, w.WorkNo, wo.Amount, wo.Rate, wo.Quantity, wo.Unit, wo.ItemCode, wo.WorkOrderBoqID, 
wo.WorkOrderIssueDate from Works w 
inner join WorkOrderBOQ wo 
on w.WorkNo != wo.Work_No and w.NIT_No != wo.NIT_No 

Ich habe gesetzt! = In ON.

+1

Ich denke, das würde nie funktionieren. Versuchen Sie es mit LEFT JOIN, um die erwarteten Ergebnisse zu erhalten. – Praveen

+0

Wenn Sie zwei Tabellen für die Datensätze vergleichen möchten, warum nicht mit EXCEPT weitermachen [except-operator-vs-not-in] (https://dba.stackexchange.com/questions/83684/except-operator-vs-not-in) – Joby

+0

Wenn Sie irgendwelche 'NULL' Werte treffen, wird Ihnen'! = 'Nicht das gewünschte Ergebnis liefern. Ihre Anfrage basiert auch ziemlich auf dem, was Sie erreichen möchten. Sie werden nicht finden, was Sie suchen. – Jens

Antwort

0

Alles, was Sie brauchen, ist eine linke Verknüpfung mit Null-Einträge aus der rechten Tabelle. Diese Abfrage -

SELECT w.NIT_No 
    ,w.WorkNo 
    ,wo.Amount 
    ,wo.Rate 
    ,wo.Quantity 
    ,wo.Unit 
    ,wo.ItemCode 
    ,wo.WorkOrderBoqID 
    ,wo.WorkOrderIssueDate 
FROM Works w 
LEFT JOIN WorkOrderBOQ wo ON w.WorkNo = wo.Work_No 
    AND w.NIT_No = wo.NIT_No 
WHERE wo.Work_No IS NULL 
    AND wo.NIT_No IS NULL 
3

Es ist arbeiten. Sie erwarten nur, dass es etwas anderes macht. Es produziert jedes Paar, wo die zwei Werte unterschiedlich sind.

Sie wahrscheinlich die Absicht:

Select w.NIT_No, w.WorkNo, wo.Amount, wo.Rate, wo.Quantity, wo.Unit, 
     wo.ItemCode, wo.WorkOrderBoqID, wo.WorkOrderIssueDate 
from Works w left join 
    WorkOrderBOQ wo 
    on w.WorkNo = wo.Work_No and w.NIT_No = wo.NIT_No 
where wo.WorkNo is null; 

Beachten Sie, dass Spalten Spalten von wo Auswahl wirklich nichts helfen, weil sie alle NULL sein wird. Also, diese Logik wird oft unter Verwendung not exists geschrieben:

Verwandte Themen