SQL在两个没有JOIN的列中使用IN的方法

时间:2016-01-15 17:59:56

标签: sql-server-2008-r2

我有以下查询:

SELECT 
    [ID], [DESCRIPCION], [EZD]  
FROM 
    [KPTA_WEB_VW_COMBOS]
WHERE 
    [EZD] = '0000128460'
    AND [EZD] IN (SELECT DISTINCT Cod_EZD, Cod_Combo
                  FROM KPTA_REP_Venta
                  WHERE Id_Dia BETWEEN  CAST(CONVERT(VARCHAR(8),DATEADD(MONTH, -200, GETDATE()),112) AS INT)
                               AND CAST(CONVERT(VARCHAR(8),GETDATE(),112) AS INT) 
                 )
GROUP BY 
    [ID], [DESCRIPCION], [EZD]

现在我有两个问题,IN处理WHERE这样写的[ID]条款,我需要对IN列做同样的事情,但我不能这样做在相同的KPTA_WEB_VW_COMBOS中使用它,有什么方法可以做到吗?

只有在[ID][EZD]列与KPTA_REP_Venta表匹配时,才会仅提供JOIN表的信息。我不想使用GROUP BY因为我不需要数据,我只是想知道这两个列中是否存在这两个列的组合并返回其中的内容。 SELECT [ID],[DESCRIPCION],[EZD] FROM [KPTA_WEB_VW_COMBOS] A WHERE [EZD] = '0000128460' --@EZD AND EXISTS (SELECT TOP 1 1 FROM KPTA_REP_Venta B WHERE B.Id_Dia BETWEEN CAST(CONVERT(VARCHAR(8),DATEADD(MONTH, -200, GETDATE()),112) AS INT) AND CAST(CONVERT(VARCHAR(8),GETDATE(),112) AS INT) AND A.[EZD]= b.[Cod_Ezd] AND A.[ID] = b.[Cod_Combo] ) GROUP BY [ID],[DESCRIPCION],[EZD] 条款。

编辑: 搜索完之后我改变了我的初始查询:

library()

1 个答案:

答案 0 :(得分:2)

您似乎正在寻找类似这样的内容,而不是单个列,但是应该在子查询中找到列的列表:

select id, descripcion, ezd  
from kpta_web_vw_combos
where (ezd, id) in
(
  select cod_ezd, cod_combo
  from kpta_rep_venta
  where id_dia between 
          cast(convert(varchar(8),dateadd(month, -200, getdate()),112) as int) and
          cast(convert(varchar(8),getdate(),112) as int) 
);

这就是许多DBMS中的donme,我很确定它是标准的SQL,但是SQL Server没有这种语法。

所以用EXISTS重写这个,正如你已经猜到的那样:

select id, descripcion, ezd  
from kpta_web_vw_combos c
where exists
(
  select *
  from kpta_rep_venta v
  where v.id_dia between 
          cast(convert(varchar(8),dateadd(month, -200, getdate()),112) as int) and 
          cast(convert(varchar(8),getdate(),112) as int) 
  and v.cod_ezd = c.ezd
  and v.cod_combo = c.id
);