子查询结果的问题以及如何通过IN过滤它

时间:2017-06-20 18:33:21

标签: sql-server

我的问题是在sql server 2008中使用子查询过滤行。

实施例,

create table A (article varchar(200),
                colour  varchar(200),
                size    varchar(200),
                prize   money)

create table B (article varchar(200),
                colour  varchar(200),
                size    varchar(200),
                prize   money)

content A

 - 00100221 BLANCO  39  30,00 
   00100221 BLANCO  40  30,00
   00100221 BLANCO  41  30,00 
   00100221 BLANCO  42  30,00
   00100221 BLANCO  43  30,00 
   00100221 BLANCO  44  30,00
   00100221 BLANCO  45  30,00 
   00100221 BLANCO  46  30,00
   00100221 GRIS    42  30,00 
   00100221 GRIS    43  30,00

content B

 - 00100221 BLANCO  39  3,00 
   00100221 BLANCO  40  30,00
   00100221 BLANCO  41  30,00 
   00100221 BLANCO  42  30,00
   00100221 BLANCO  43  30,00 
   00100221 BLANCO  44  30,00
   00100221 BLANCO  45  30,00 
   00100221 BLANCO  46  30,00
   00100221 GRIS    42  30,00 
   00100221 GRIS    43  30,00

select  A.* 
  from A  

 where A.article in 
                     ( 
                       select Article 
                         from B 
                        where B.Article = A.Article
                          and B.Colour = A.Colour
                          and B.size = A.size
                          and B.prize <> A.prize   
                     ) 

此查询的结果是:

00100221 BLANCO 39 30,00

但我希望所有的行。

子查询的结果是一篇文章。但是主查询只显示匹配子查询中所有条件的位置。

4 个答案:

答案 0 :(得分:0)

请尝试使用JOIN

select  v.* 
  from vu_oc_u_web_can v 
  join oc_u_web u ON u.Articulo = v.Articulo 
                      and u.Color = v.colorpro 
                      and u.Talla = v.talla
WHERE u.PVPRebaja <> v.preciorebtar   

答案 1 :(得分:0)

您要求表B中的鞋子(?)数据具有不同的价格,并且这只是第一个!也许你正在寻找类似的东西:

select A.*,
       case
        when B.Price <> A.Price then 'X'
        else ''
       end as HasDifferentPriceInTableB
  from A  
  join B on B.Article = A.Article and
            B.Colour  = A.Colour  and
            B.Size    = A.Size

答案 2 :(得分:0)

在我读到的内容中,你想要表A的所有行,即使表b中的记录与条件A.prize <> B.prize不匹配,如下所示:

select  A.*, B.prize from A  
left outer join B on
B.article = A.article and
B.prize <> A.prize

这就是我对查询所需内容的理解。

答案 3 :(得分:0)

解决方案是

    select  A.* 
  from A  

 where A.article in 
                     ( 
                       select Article 
                         from B 
                         left join A X
                           on B.Article = X.Article
                          and B.Colour = X.Colour
                          and B.size = X.size
                          and B.prize <> X.prize   
                     )