Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有没有办法做两个重叠的查询,包括第一个查询和第二个查询的重叠部分,而只做两个查询?_Sql_Sql Server - Fatal编程技术网

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

Sql 有没有办法做两个重叠的查询,包括第一个查询和第二个查询的重叠部分,而只做两个查询?,sql,sql-server,Sql,Sql Server,所以问题是我有一个数据集,其中每一行包含以下数据: ID, data, year, meta 不同年份的数据略有不同,但每年都有一些数据。我想查询仅在某些年份中存在的数据,但我还想查询查询中每年都存在的数据 例如: 数据1可以是2011-2013年 而数据2可能是在2009-2015年 我想查询它们,它们都有一个匹配的ID,并且都只存在于当年。到目前为止,我有一个有效的解决方案 SELECT ID, data, year, meta FROM table1 WHERE

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

   ID, data, year, meta
不同年份的数据略有不同,但每年都有一些数据。我想查询仅在某些年份中存在的数据,但我还想查询查询中每年都存在的数据

例如:

  • 数据1可以是2011-2013年
  • 而数据2可能是在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'
重复一次(它在第一次查询中用作一个条件,然后它本身也会被查询。我想知道是否有一种方法可以查询我想要的内容,而不必重复上述查询。即,我要执行一个查询,返回结果,然后执行另一个查询,该查询在第一次查询中只包含重叠的数据,而总共只执行两个查询。al. 输入示例:

    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):


您创建一个怎么样

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 

你是在问
UNION
vs
UNION ALL
?一个人把一切都结合起来,只取唯一的条目;
{1,2,3}UNION ALL{3,4,5}=>{1,2,3,3,4,5}
3
重复)其中as
{1,2,3}UNION{3,4,5}=>{1,2,3,4,5}
(代码>3不重复)。请注意,这也意味着您的输入中的重复项也将被消除…
{1,2,3,3}UNION{4,5}=>{1,2,3,4,5}
(无论这是否是您想要的,我们都建议您包含一些实际的示例数据以及您期望从这些数据中得到的结果。)我看不出你在哪里重复这个选择?你使用'like'DATA1'的查询是不同的。我想做两个查询,在这两个年份中都可以找到相同的ID(因此如果在其中(DATA1)的集合中找到metavalue(DATA2))是存在的,这意味着它们是在同一年记录的。我明确地想要UNION ALL,但无论如何都不应该有重复项。@telac-如果没有示例输入数据,示例输出数据将不会有多大帮助。也许我遗漏了一些东西,但从中我既看不到您的原始查询,也看不到接受的答案会生成e您提供的预期输出(请参阅)。要获得预期的输出,您可以使用此中的任何查询。或者我误解了什么?或者您的示例预期输出不正确?啊,这是有道理的,我现在理解了这个问题…值得注意的是,在SQL Server中,CTE不是缓存的结果集。这意味着这确实有助于您避免重复(干燥)原则,但不能避免服务器上的冗余负载。嘿,谢谢!这就是我一直在寻找的。@MatBailie,你知道有没有更好的方法来做到这一点,或者这是最好的方法吗?@MatBailie你能提供一个关于这个事实的链接吗?我真的认为这是某种预先计算好的设置。@JuanCarlosOropeza-没有任何链接特别是。但是如果您搜索
SQL Server CTE物化
SQL Server CTE扩展
,您会发现很多关于它的信息分布在web上。用过于简化的术语来说,CTE就像一个宏,并经历类似宏的扩展(就像视图通常所做的那样)。这里有一个SO链接。。。
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