2014-01-23 53 views
0

我需要从表中删除一堆记录。我发现了一个可以完成这个工作的查询,但我被告知不支持子查询,但连接是..是否有可能将以下查询转换为连接。如果是这样如何?是否有可能将SELECT-IN-SELECT查询转换为JOIN查询?

SELECT * 
FROM PRODUCT 
WHERE PROD_NAME IN 
    (SELECT PROD_NAME 
    FROM PRODUCT 
    WHERE BRAND = 'Apt88' 
     AND NAME = 'Version' 
     AND VALUE IN ('3.7', '3.8')) 

赞赏任何帮助,

特德

+3

这是MySQL还是SQL Server? – Dan

+0

是的。它是。最简单的方法是采用内部查询,并在“p2.PRODUCT_NAME = PRODUCT.PRODUCT_NAME”上加入产品p2。在这种情况下,从“p2”中选择,您可能想要添加“DISTINCT”。 – Wrikken

回答

0

这里是正确的等价:

SELECT p.* 
FROM PRODUCT p join 
    (SELECT distinct PROD_NAME 
     FROM PRODUCT 
     WHERE BRAND = 'Apt88' AND NAME = 'Version' AND VALUE IN ('3.7', '3.8') 
    ) pn 
    on p.prod_name = pn.prod_name; 

注意使用distinct。如果你的行是不同的(但不一定prod_name),那么你可以这样做:

SELECT distinct p.* 
FROM PRODUCT p join 
    PRODUCT pn 
    on p.prod_name = pn.prod_name; 
WHERE pn.BRAND = 'Apt88' AND pn.NAME = 'Version' AND pn.VALUE IN ('3.7', '3.8'); 
+0

您试图通过加入...子查询来避免子查询。 :D –

+1

@KouberSaparev。 。 。不,我试图通过子查询来得到一个'in'等同于'in'的值。 –

2

你是对的 - 从你从MySQL中不支持选择同一个表中删除。但您可以用另一个子查询来欺骗

DELETE FROM PRODUCT 
WHERE PROD_NAME IN 
(
    select * from 
    (
     SELECT PROD_NAME 
     FROM PRODUCT 
     WHERE BRAND = 'Apt88' AND NAME = 'Version' AND VALUE IN ('3.7', '3.8') 
    ) x 
) 
+0

也许我错过了一些东西,但是它的功能与简单的'删除产品其中BRAND ='Apt88'AND NAME ='Version'和VALUE IN('3.7','3.8')'? (不是特别批评你的答案;同样的问题适用于在原问题中使用子查询。) – Wiseguy

+0

@Wiseguy,提示:'从产品中删除品牌='Apt88'AND NAME ='Version'AND VALUE IN('3.7' ,'3.8')'不引用'PROD_NAME'。 –

+0

@MarcusAdams我认为这是一个多余的步骤,使用'PROD_NAME'作为ID,但现在我明白了。如果多个记录具有相同的“PROD_NAME”,则即使只有其中一个记录符合品牌/名称/值条件,它们也会被删除。对? – Wiseguy

0

是的,您可以将产品表加入自己。你只需要使用两个独立的别名在查询中的逻辑上独立的表之间进行区分:

SELECT p1.* 
FROM PRODUCT p1 
INNER JOIN PRODUCT p2 on p1.PROD_NAME = p2.PROD_NAME 
WHERE p2.BRAND = 'Apt88' 
AND p2.NAME = 'Version' 
AND p2.VALUE IN ('3.7', '3.8')