有没有办法做两个重叠的查询,包括第一个查询的重叠部分和完整的第二个查询,而只做两个查询?

时间:2015-10-26 12:37:16

标签: sql sql-server

所以问题是我有一个数据集,其中每行包含以下数据:

   ID, data, year, meta

不同年份的数据有所不同,但每年都有一些数据。我想查询仅在几年内存在的数据,但我还想查询查询中每年存在的数据。

例如:

  • DATA1可以在2011-2013年,
  • 而DATA2可以在2009-2015年。

我想查询它们,它们具有匹配的ID,并且仅存在于该年。到目前为止,我所拥有的工作解决方案就是这个。

    SELECT ID, data, year, meta
    FROM table1 WHERE year IN 

    (
    SELECT year
    FROM table1
    WHERE meta LIKE 'DATA1'
    )

   AND meta LIKE 'DATA2'

   UNION ALL 

   (
   SELECT ID, data, year, meta
   FROM table1
   WHERE meta LIKE 'DATA1'
   )

   ORDER BY year, ID

这里的问题是查询

   SELECT ID, data, year, meta
   FROM table1
   WHERE meta LIKE 'DATA1'

重复一次(它在第一个查询中用作条件,然后它也会自己查询。我想知道是否有查询我想要的方法,而不重复上述查询。 即我想进行查询,返回结果,然后执行另一个查询,该查询只包含第一个查询中重叠的数据,而总共只执行两个查询。 示例输入:

    122, DATA1_datapoint, 2010, DATA2
    122, DATA1_datapoint, 2009, DATA2
    123, DATA1_datapoint, 2011, DATA2
    123, DATA2_datapoint, 2011, DATA1
    124, DATA1_datapoint, 2012, DATA2
    124, DATA2_datapoint, 2012, DATA1

预期输出(id是3位数字,例如123):

    123, DATA1_datapoint, 2011, DATA1
    123, DATA2_datapoint, 2011, DATA2
    124, DATA1_datapoint, 2012, DATA1
    124, DATA2_datapoint, 2012, DATA2

1 个答案:

答案 0 :(得分:2)

如何创建 CTE

WITH CTE AS ( 
   SELECT ID, data, year, meta
   FROM table1
   WHERE meta LIKE 'DATA1'
) 
SELECT ID, data, year, meta
FROM table1 
WHERE year IN (SELECT year FROM CTE)
  AND meta LIKE 'DATA2'
UNION ALL 
SELECT ID, data, year, meta 
FROM CTE
ORDER BY year, ID