0

我有两个查询,Q1 和 Q2。

Q1 为每个演示和日期生成一个结果。

Q2 为每个演示、日期和站点生成一个结果。

此外,第二季度给定演示和站点的日期将与第一季度重叠,

但第一季度的所有日期都不存在,甚至可能在第二季度有一些新的日期在第一季度不存在。

我想要做的是生成一个结果表,其中 Q1 的结果基本上重复(行下方的行)等于 Q2 中的站点数。

第二季度的结果应该在第二列,日期和演示匹配。

如果 Q1 中的日期在 Q2 的该站点中不存在,则该条目应为零或空。我知道这可以通过加入来实现,但我无法让它发挥作用。我试过了 -

select a.result, b.site, b.result from
(Q1) as a right join (Q2) as b on a.demo = b.demo and a.date=b.date

但这会产生一些奇怪的结果。对于 Q2 的每个站点,a.result 的条目都是不同的,尽管它们不应该是不同的。

编辑 - 这是我想要做的 -

Q1 -

demo    |   date
------------------------------
1       |   10/31/2013
1       |   11/01/2013
2       |   11/02/2013

Q2 -

 demo   |   site    |   date
------------------------------
1       |   A       |   10/31/2013
1       |   A       |   11/01/2013
2       |   B       |   11/01/2013
2       |   B       |   11/02/2013

想要的结果——

    demo    |   date          | site
---------------------------------------
   1        |   10/31/2013    |  A
   1        |   11/01/2013    |  A
   2        |   11/02/2013    |  null
   1        |   10/31/2013    |  null
   1        |   11/01/2013    |  B
   2        |   11/02/2013    |  B  
4

3 回答 3

0

使用内连接代替右连接

select a.result, b.site, b.result from (Q1) as a 
inner join (Q2) as b on a.demo = b.demo and a.date=b.date
于 2013-10-31T02:42:13.387 回答
0

根据您的说明,您可以通过此查询获得该结果。

SELECT
    a.demo,
    a.date,
    b.site
FROM (Q1) a
LEFT JOIN (Q2) a ON b.date = a.date

但是,按照结果列表中的方式对其进行排序将需要子查询中的更多信息。您需要使用 Row_Number() 之类的函数(假设您使用的是 MSSQL)在子查询中生成唯一 ID 以用于排序。

于 2013-10-31T02:46:22.337 回答
0

这是我认为您所要求的SQL Fiddle示例:

SELECT M.demo, M.date, M.site FROM
(
  SELECT 2 AS FromQuery, Q2.demo, Q2.date, Q2.site
  FROM Q2
  UNION
  SELECT 1 AS FromQuery, Q1.demo, Q1.date, null AS site
  FROM Q1
) AS M
ORDER BY M.FromQuery
于 2013-10-31T04:12:08.100 回答