Bitte sehen Sie:

http://sqlfiddle.com/#!18/479d1

Ich habe diese Tabellen:

CREATE TABLE Item 
(
    OrderNo varchar(10),
    ItemNo varchar(10)
);

CREATE TABLE Order1 
(
    OrderNo varchar(10),
    Month varchar(10)
);

INSERT INTO Item (OrderNo, ItemNo)
VALUES ('111','222'), ('111','333'),
       ('333','444'), ('333','222'), ('333','555'),
       ('444','222'), ('444','555');

INSERT INTO Order1 (OrderNo, Month)
VALUES ('111','Feb'), ('333', 'Jan'), ('444', 'May');

Ich möchte Bestellungen zurücksenden, die nicht den Artikel '555' enthalten. Ich dachte, das wäre eine Unterabfrage, aber ich kann es einfach nicht richtig machen.

Ich habe versucht:

SELECT 
    O.[OrderNo],
    O.[Month],
    I.[ItemNo]
FROM 
    Order1 O
JOIN 
    Item I ON O.[OrderNo] = I.[OrderNo]
WHERE 
    O.[OrderNo] IN (SELECT I.[OrderNo]
                    FROM Item I
                    GROUP BY I.[OrderNo], I.[ItemNo]
                    HAVING I.[ItemNo] <> '555')

Was dieses Ergebnis zurückgibt:

| OrderNo | Month | ItemNo |
|---------|-------|--------|
|     111 |   Feb |    222 |
|     111 |   Feb |    333 |
|     333 |   Jan |    444 |
|     333 |   Jan |    222 |
|     333 |   Jan |    555 |
|     444 |   May |    222 |
|     444 |   May |    555 |

In diesem Fall möchte ich jedoch alle Bestellungen mit Artikel '555' entfernen. Das Ergebnis sieht also so aus:

| OrderNo | Month | ItemNo |
|---------|-------|--------|
|     111 |   Feb |    222 |
|     111 |   Feb |    333 |
1
Ryan Gadsdon 19 Apr. 2018 im 13:53

4 Antworten

Beste Antwort

Sie müssen nur Ihr Denken umkehren - Sie möchten die NOT in der Liste der Bestellungen mit einem 555.

SELECT 
O.[OrderNo],
O.[Month],
I.[ItemNo]
FROM Order1 O
JOIN Item I ON O.[OrderNo] = I.[OrderNo]
WHERE O.[OrderNo] NOT IN
( SELECT I.[OrderNo]
FROM Item I
WHERE I.[ItemNo] = '555')

http://sqlfiddle.com/#!18/479d1/20

1
Andrew 19 Apr. 2018 im 12:33

Wie wäre es mit einer einfachen Unterabfrage ohne Gruppierung? Ändern Sie einfach IN in NOT IN, ändern Sie die Bedingung von <> '555' in = '555' und entfernen Sie die Gruppierung:

SELECT O.[OrderNo], O.[Month], I.[ItemNo]
FROM Order1 O
INNER JOIN Item I ON O.[OrderNo] = I.[OrderNo]
WHERE O.[OrderNo] NOT IN (SELECT [OrderNo]
                          FROM Item
                          WHERE [ItemNo] = '555')
1
Racil Hilan 19 Apr. 2018 im 11:04

Verwenden Sie einfach not exists:

select o.*
from order1 o
where not exists (select 1
                  from items i
                  where i.orderno = o.orderno and i.itemno = 555
                 );

Wenn Sie alle Artikel sowie die Bestellungen möchten, können Sie sie join in:

select o.*, i.itemno
from order1 o join
     items i
     on o.orderno = i.orderno
where not exists (select 1
                  from items i
                  where i.orderno = o.orderno and i.itemno = 555
                 );
0
Gordon Linoff 19 Apr. 2018 im 10:57

Versuchen Sie es mit einer einfachen Unterabfrage.

Select a.OrderNo, a.Month, b.ItemNo 
From Order1 a  
Inner Join  Item b 
On b.OrderNo = a.OrderNo 
Where a.OrderNo  
Not In (Select OrderNo From Item Where Itemno = '555')
0
Pravin K. 19 Apr. 2018 im 11:13