2013-10-31 101 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