SQL Server Unterabfrage hat mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =, !=, <, <= , >, >=
Ich die folgende Abfrage ausführen:
SELECT
orderdetails.sku,
orderdetails.mf_item_number,
orderdetails.qty,
orderdetails.price,
supplier.supplierid,
supplier.suppliername,
supplier.dropshipfees,
cost = (SELECT supplier_item.price
FROM supplier_item,
orderdetails,
supplier
WHERE supplier_item.sku = orderdetails.sku
AND supplier_item.supplierid = supplier.supplierid)
FROM orderdetails,
supplier,
group_master
WHERE invoiceid = '339740'
AND orderdetails.mfr_id = supplier.supplierid
AND group_master.sku = orderdetails.sku
Bekomme ich die folgende Fehlermeldung:
Msg 512, Ebene 16, Status 1, Zeile 2
Unterabfrage hat mehr als 1 Wert. Dies ist nicht zulässig, wenn die Unterabfrage folgt =, !=, <, <= , >, >= oder wenn die Unterabfrage als Ausdruck verwendet.
Irgendwelche Ideen?
Oh, und aufhören, die implizite join-syntax, Es ist eine sehr schlechte Praxis, schwieriger zu verwalten und einfacher, Fehler zu machen.
warum ist es schlechte Praxis, schwieriger zu verwalten und einfacher, Fehler zu machen?
warum ist es schlechte Praxis, schwieriger zu verwalten und einfacher, Fehler zu machen?
InformationsquelleAutor Anilkumar | 2010-04-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen Sie dies:
Dadurch werden mehrere Zeilen zurückgeben, die sind identisch, außer für die
cost
Spalte. Schauen Sie sich die verschiedenen Kosten-Werte, die zurückgegeben werden und herauszufinden, was die Ursache für die unterschiedlichen Werte. Dann bitten Sie jemanden, die Kosten Wert, die Sie möchten, und fügen Sie die Kriterien in der Abfrage, wählen, Kosten.InformationsquelleAutor Jeffrey L Whitledge
Überprüfen, um zu sehen, ob es irgendwelche Trigger auf die Tabelle, die Sie versuchen, führen Sie Abfragen. Manchmal können Sie diesen Fehler auslösen, wie Sie versuchen, führen Sie das update/select/insert-trigger, der auf dem Tisch liegt.
Können Sie die Abfrage so ändern, deaktivieren, aktivieren Sie dann den Auslöser, wenn die trigger - NICHT müssen ausgeführt werden, für was auch immer Abfrage, die Sie ausführen möchten.
Ja, aber bitte sehen Sie den Fett gedruckten text in die Antwort. Sie können ändern Sie Ihre Abfrage zu deaktivieren, dann aktivieren Sie die trigger wenn der trigger NICHT ausgeführt werden müssen, für was auch immer Abfrage, die Sie ausführen möchten.
Ändern der Tabelle bei der Abfrage ist absolut schrecklich. Wenn Sie brauchen, um überspringen Sie den Auslöser, machen Sie es auf einer pro-Verbindung-basis.
InformationsquelleAutor jk.
Hinweis: wenn wir mit sub-query müssen wir den Fokus auf Punkt
InformationsquelleAutor Diyar sereroy
Diese Unterabfrage gibt mehrere Werte, SQL beschweren, denn es können nicht mehrere Werte zuzuweisen Kosten in einem einzigen Datensatz.
Einige Ideen:
InformationsquelleAutor Mayo
Korrigieren aufhören, korrelierte Unterabfragen und joins verwenden statt. Korrelierte Unterabfragen sind im wesentlichen Cursor, wie Sie führen Sie die Abfrage ausführen, row-by-row und sollte vermieden werden.
Müssen Sie möglicherweise eine abgeleitete Tabelle in der join-um den von Ihnen gewünschten Wert in das Feld, wenn Sie möchten nur einen Datensatz übereinstimmen, wenn Sie müssen beide Werte, dann die gewöhnlichen
join
tun, aber Sie erhalten mehrere Datensätze für die gleiche id in der Ergebnismenge. Wenn Sie nur wollen, Sie brauchen, um zu entscheiden, was man tun, und dass in dem code, den Sie verwenden konnten, eintop 1
mit einemorder by
könnten Siemax()
könnten Siemin()
etc, je nachdem, was Ihre wirkliche Anforderung für die Daten ist.InformationsquelleAutor HLGEM
Entweder Ihre Daten ist schlecht, oder es ist nicht so strukturiert, wie Sie denken es ist. Vielleicht beides.
Beweisen/widerlegen diese Hypothese, diese Abfrage ausführen:
Wenn dieser gibt nur ein paar Zeilen, dann Ihre Daten schlecht. Wenn es gibt viele Zeilen, dann Ihre Daten nicht so strukturiert, wie Sie denken es ist. (Wenn es gibt keine Zeilen, ich bin falsch.)
Ich vermute, dass Sie Aufträge mit dem gleichen
SKU
mehrere Male (zwei separate line items, sowohl für die Bestellung der gleichenSKU
).InformationsquelleAutor egrunin
Ich hatte das gleiche problem , ich verwendet
in
statt=
von derNorthwind
- Datenbank-Beispiel :Versuchen Sie dies :
Statt :
InformationsquelleAutor JAN
Die select-Anweisung in der Kosten-Teil der select ist zurückgeben, die mehr als einen Wert. Sie benötigen, um mehr hinzuzufügen where-Klauseln oder die Verwendung einer aggregation.
InformationsquelleAutor cjk
Den Fehler impliziert, dass diese Unterabfrage zurückgeben, die mehr als 1 Zeile:
Sie wahrscheinlich nicht wollen, gehören die orderdetails-und Lieferanten-Tabellen in der Unterabfrage, weil Sie wollen, um die Referenz der ausgewählten Werte aus diesen Tabellen in der äußeren Abfrage. Also ich denke, Sie wollen die Unterabfrage einfach:
Ich schlage vor, Sie Lesen, auf korrelierte und nicht-korrelierte Unterabfragen.
InformationsquelleAutor Dave Costa
Als andere haben vorgeschlagen, der beste Weg, dies zu tun, ist die Verwendung einer Verknüpfung anstelle der Variablen Zuordnung. Re-schreiben Sie Ihre Abfrage mit einem join (und über die explizite join-syntax anstelle der impliziten Joins, die wurde auch vorgeschlagen--und ist die beste Praxis), würden Sie bekommen so etwas wie dieses:
InformationsquelleAutor KP Taylor