Удалить все строки, которые не смогли найти JOIN? - PullRequest
2 голосов
/ 24 мая 2011

У меня есть этот запрос:

SELECT Auctions.ID 
FROM Auctions
INNER JOIN Products ON Auctions.ProductID = Products.ID

Теперь, насколько я знаю, если у меня есть аукцион:

ID | ProductID
1  |   12

И ProductID 12 отсутствует в таблице Products, поэтому строка не будет выбрана.

Если я прав, я хочу удалить все строки, которые не нашли идентификатор продукта в таблице "Продукты". (товары, которые не нашли JOIN)

Как я могу это сделать?

Ответы [ 4 ]

5 голосов
/ 24 мая 2011
DELETE FROM a
    FROM Auctions a
    WHERE NOT EXISTS(SELECT NULL FROM Products p WHERE p.ID = a.ProductID)
4 голосов
/ 24 мая 2011
DELETE Auctions WHERE ProductId NOT IN(SELECT ProductId FROM Products)

Конечно, после того, как вы сделаете это, сделайте себе одолжение и создайте Отношения от Auctions.ProductId до Products.ProductId, если вы не хотите делать это снова.

3 голосов
/ 24 мая 2011

Немного другой взгляд на приведенные выше ответы. Первый показывает, какие аукционы не имеют соответствующего продукта, второй фактически удаляет их. Первый может быть полезен в случае отсутствия продуктов.

-- This query identifies everything that is in
-- Auctions that doesn't have a match in Product
SELECT
    A.*
FROM
    Auctions A
    LEFT OUTER JOIN 
        Products P 
        ON A.ProductID = P.ID
WHERE
    P.ProductID IS NULL


-- This query deletes everything that is in
-- Auctions that doesn't have a match in Product
DELETE
    A
FROM
    Auctions A
    LEFT OUTER JOIN 
        Products P 
        ON A.ProductID = P.ID
WHERE
    P.ProductID IS NULL
2 голосов
/ 24 мая 2011
DELETE FROM Auctions WHERE ProductId NOT IN (SELECT ProductId FROM Products)
...