2013-10-31 104 views
0

我有两个查询,Q1和Q2。加入sql给我奇怪的结果

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

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

而且,从第二季度给定的演示和网站上的日期将与Q1一些重叠,

但是从第一季度的所有日期将不会在那里,甚至有可能在第二季度一些新的日期是不在Q1。

我想要做的是生成一个结果表,其结果基本上重复了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 
+0

我没有理解你的一切写,但我摔倒了,你应该尝试使用'左join'代替。 –

+0

您可以添加一些示例输入和输出吗?还有你的dbms? – unlimit

+0

这有点难以理解,你可以通过发布Q1和Q2产生的结果(样本数据)以及你想得到的结果来做。 –

回答

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 
+0

Thanks Low ..请参阅我的编辑..此查询不会产生所需的空值。 –

0

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

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

但是,如果在结果列表中对它进行排序,则需要子查询中的更多信息。您需要使用像Row_Number()这样的函数(假设您使用的是MSSQL)在子查询中生成唯一ID以用于排序。

+0

谢谢雅各布,但那不是我正在做的事情..看到我的编辑。 –

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