2016-07-11 9 views
2

Ich habe eine SQL-Anweisung geschrieben, wo diese bestimmten Spalten aus einer Tabelle stammen und es mit einer anderen Tabelle verbindet und der Primärschlüssel, ReportID, dient als Verknüpfung zwischen den beiden Tabellen. Ich verwende NOT IN, um die Berichte einer Firma genau anzuzeigen, aber ich erhalte keine Ausgabe, wenn eine Firma ausgewählt wird. Gibt es irgendwo in der Abfrage, dass ich neu anordnen müsste?NICHT IN und ein SQL-Join

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
       FROM CompanyReportListTable c 
       right join ReportList rl on c.reportid = rl.ReportID 
       WHERE c.reportid NOT IN(Select rl.ReportID FROM ReportList rl) 
       and rl.ReportVisible = 1 
       and CompanyID = " & DropDownList1.SelectedValue 
+0

MySQL und SQL-Server sind nicht die gleiche Sache, die Sie tatsächlich verwenden? – Barmar

+2

Sie sollten lesen, verstehen und beginnen, parametrisierte Abfragen zu verwenden, bevor Sie sich SQL Injection aussetzen. –

+4

Ihr 'nicht in' wählt alle Datensätze aus der Tabelle aus, der Sie beigetreten sind, mit Ausnahme aller darin enthaltenen Datensätze. –

Antwort

0

Die NICHT IN keine Notwendigkeit für sie es ist, warum Sie in verwenden, wenn Sie nur auf der Join verwenden, gibt es keinen Vorteil davon, die einzige Möglichkeit, nur, wenn Sie andere Aufzeichnung der wählen haben gleiche Tabelle (wenn Sie etwas wie Baumstruktur verwenden), was Sie versuchen zu tun, ist das Ergebnis wird Null Datensätze sein.

Ich glaube, Sie so etwas wie dies nur wollten:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
    FROM CompanyReportListTable c 
     right join ReportList rl on c.reportid = rl.ReportID 
    WHERE rl.ReportVisible = 1 
     and CompanyID = " & DropDownList1.SelectedValue 

Und mit INNER JOIN aussehen:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
    FROM CompanyReportListTable c 
     inner join ReportList rl on c.reportid = rl.ReportID 
    WHERE rl.ReportVisible = 1 
     and CompanyID = " & DropDownList1.SelectedValue 

Letztes Beispiel mit LEFT JOIN:

valsql1 = "SELECT DISTINCT c.ReportID, c.COMPANYID, rl.REPORTNAME 
    FROM CompanyReportListTable c 
     left join ReportList rl on c.reportid = rl.ReportID 
    WHERE rl.ReportVisible = 1 
     and CompanyID = " & DropDownList1.SelectedValue 
+1

Ich tat und es funktionierte zuerst, aber ich erkannte, dass es mehr Werte als erwartet angezeigt würde, so war meine Absicht bei dieser Join-Anweisung zu bleiben, zeigen Sie alle Berichte unabhängig von der Firma, aber ausschließen die Ungeprüfte Berichte oder Nullwerte, um genau zu sein. Nun, von dem, was Sie über Null-Datensätze gesagt haben, ist das, was ich jetzt erlebe. –

+0

Wenn Sie nicht wollen, dass das Nullergebnis nur "inner join" verwendet, als "rechts join" (das rechte join return null, wenn nicht in der anderen Tabelle das linke in diesem Fall gefunden wird), schauen Sie sich jetzt die Antwort mit inner an Beitreten . –

+1

Durch die Verwendung von Inner Join erhielt ich Berichte, die für das Unternehmen geeignet sind. Nehmen Sie nun an, dass die entsprechenden Berichte angezeigt wurden, aber auch andere Berichte, die für das Unternehmen nicht geeignet waren und nicht geprüft wurden. Wäre ich wieder zurück zum richtigen Join oder benutze entweder NOT IN oder NOT EXIST? –

1

I don Ich glaube nicht, dass Sie alle Berichte ausschließen wollten. Es ist sehr schwierig, den Zweck der zwei verschiedenen Tabellen zu erraten, aber ich glaube, Sie müssen nur die Liste der Berichte, die Sie ausschließen möchten, abschneiden. (In einer anderen Antwort verweisen Sie „ungeprüfte Berichte oder Nullwerte“ auf.)

SELECT ReportID, COMPANYID, REPORTNAME 
FROM CompanyReportListTable c 
WHERE 
    ReportID NOT IN 
     (
     SELECT rl.ReportID FROM ReportList rl 
     WHERE ... /* which reports are you trying to exclude? */ 
     ) 
    AND ReportVisible = 1 AND CompanyID = ? 
+0

Ich war in der Lage, die Checkboxen erscheinen zu lassen und es würde unterschiedliche Anzahl der Checked Checkboxen geben, was impliziert, dass die Anzahl der Checkboxen für das Unternehmen angemessen war. Das Problem war, dass ReportName nicht angezeigt wurde oder nicht gebunden werden konnte. –

0

Also hier ist, was ich tat, dieses Problem zu lösen: Entfernen Sie das Schlüsselwort DISTINCT, halten das Recht kommen für die beiden Tabellen. Lassen Sie den Berichtvisuell auf 1 setzen. Wenn ein Unternehmen aus der Dropdownliste ausgewählt wurde, wählen Sie die Berichts-ID in der ReportList-Tabelle rl nicht mit NOT IN, sondern mit IN aus. Wählen Sie die ReportID aus Tabelle 2, ReportList, und lassen Sie sie sichtbar und geordnet durch seinen Namen für Klarheit. Wenn Sie sie beibehalten, werden die Ergebnisse für jedes Unternehmen genau angezeigt, aber deaktivieren Sie dieses Mal die nicht verknüpften pro Unternehmen. Unabhängig von der Anzahl der Berichte pro Unternehmen werden die zugehörigen Berichte angezeigt. Hier ist die richtige Abfrage

valsql1 = "SELECT c.ReportID, c.COMPANYID, rl.REPORTNAME 
FROM CompanyReportListTable c 
right join ReportList rl on c.reportid = rl.ReportID and reportvisible = 1 and CompanyID =" & DropDownList1.SelectedValue & " 
where rl.ReportID IN (Select ReportID from ReportList where ReportVisible = 1) 
order by ReportName" 
Verwandte Themen