加入sql给我奇怪的结果

时间:2013-10-31 02:24:54

标签: sql join

我有两个问题,Q1和Q2。

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

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

此外,来自Q2的给定演示和站点的日期与Q1有一些重叠,

但是Q1的所有日期都不会出现,第二季度可能会有一些新的日期在第一季度不存在。

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

Q2的结果应该在第二列,并在日期和演示上匹配。

如果Q2的该站点中不存在Q1中的日期,则该条目应为零或为空。我知道这可以通过连接实现,但我不能让它工作。我试过了 -

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  

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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