2009-10-01 20 views
-2

使用SQL Server 2000製作表格加入問題?

有兩個表

表1

Date ID 

20090101 001 
20090102 001 
…. 
20090101 002 
20090102 002 
… 

20090101 003 
20090102 003 
… 

於是就..,

表2

ID Name Date 

001 Raja 20090408 
001 Raja 20090502 
001 Raja 20090503 
002 Ravi 20090312 
002 Ravi 20090522 
003 Saga 20090802 
003 Saga 20091022 

於是就..,

查詢

SELECT 
    Table1.Date, Table1.ID, 
    Table2.Name, Table2.Date 
FROM table1 
INNER JOIN table2 ON table1.id = table2.id 
ORDER BY table1.id, table1.date 

輸出

Date ID Name Table2.Date 

20090101 001 Raja 20090408 
20090101 001 Raja 20090502 
20090101 001 Raja 20090503 
20090102 001 Raja 20090408 
20090102 001 Raja 20090502 
20090102 001 Raja 20090503 
… 

20090101 002 Ravi 20090312 
20090101 002 Ravi 20090522 
20090102 002 Ravi 20090312 
20090102 002 Ravi 20090522 
… 

...等,

爲什麼我一次又一次地得到一個table1.date。我想要這樣顯示。

期望輸出

Date ID Name Table2.Date 

20090101 001 Raja - 
… 
20090502 001 Raja 20090502 
20090503 001 Raja 20090503 
… 
20090107 001 Raja - 
20090108 001 Raja 20090408 
…. 

...等,

我把 「 - 」,而不是空列

Table2.Date should equal to Table1.Date, means 
Table1.Date, Table1.ID should display all the columns, 
Table2.Date should display with Table1.Date Related column. 

例。

Table2 Column Values are 

Date - 20090203, 20090205..., 

Table1.ID Table1.Date Table2.Date 

001 20090201 
001 20090202 
001 20090203 20090203 
001 20090204 
001 20090205 20090205 
001 20090206 

..., 

之前,我做在Access查詢2003

SELECT AllPossibleCardEvents.Id, AllPossibleCardEvents.Date, Actual.Date AS Table2Date FROM ((SELECT p.Id, AllDates.Date FROM (SELECT DISTINCT Date FROM table2) AllDates, table1 p) AllPossibleCardEvents LEFT OUTER JOIN table2 Actual ON AllPossibleCardEvents.Id = Actual.Id AND AllPossibleCardEvents.tDate = Actual.Date)) 

現在上面的查詢工作完全爲我預期的輸出接入

如何使這種情況下的SQL查詢?

需要查詢幫助

+0

我得到table1.date與table2.Date列只有通過使用左連接,我需要Table1.Date,Table1.ID應該顯示所有列,Table2.Date應該顯示與Table1.Date相關的列。 – Gopal 2009-10-01 12:09:01

+0

我將你的訪問查詢翻譯成sqlserver,你能告訴它它是否適用於你? – manji 2009-10-01 15:04:48

回答

1
SELECT AllPossibleCardEvents.Date, 
     AllPossibleCardEvents.ID, 
     COALESCE(Table2.Date, '-') Table2Date 
FROM (SELECT DISTINCT t1.ID, t2.Date 
     FROM table1 t1 CROSS JOIN table2 t2) AllPossibleCardEvents 
    LEFT JOIN table2 ON AllPossibleCardEvents.ID = table2.ID 
        AND AllPossibleCardEvents.Date = table2.Date 
ORDER BY AllPossibleCardEvents.ID, AllPossibleCardEvents.Date 
+1

爲什麼矯枉過正?你可以說ISNULL(Table2.Name,' - ')而不是嵌入案例 – Jabezz 2009-10-01 10:38:54

+0

我不問關於空列,我需要Table1.Date,Table1.ID應該顯示所有的列,Table2.Date應該與Table1一起顯示。日期相關列現在,我只能獲取與table2.Date列相關的table1.date。 – Gopal 2009-10-01 12:07:21

+0

@Jabezz,ISNULL不符合ANSI 92,所以可移植性是一個問題,並且不遵守數據類型優先級的規則,這與CASE WHEN和COALESCE不同。我將使用COALESCE。 – manji 2009-10-01 13:27:02

4

通過它的外觀,你缺少的是加入日期列,以及:

Select 
    Table1.Date, Table1.ID, Table2.Name, Table2.Date 
from table1 
inner join table2 on table1.id = table2.id and table1.date = table2.date 
order by table1.id, table1.date 

這是,如果我理解正確你的問題。

如果你想顯示NULL值,您需要更改爲左,雖然加入:

Select 
    Table1.Date, Table1.ID, Table2.Name, Table2.Date 
from table1 
left join table2 on table1.id = table2.id and table1.date = table2.date 
order by table1.id, table1.date 

EXTRA:

我已經添加了一些額外的SQL可能給你相當於結果您的Access查詢。 如果我正確理解Access查詢,則會匹配所有記錄,但只有在與table1.Date匹配時纔會顯示table2.Date。

試試這個:

SELECT 
    table1.Id, 
    table1.Date, 
    CASE WHEN table1.Date = table2.Date THEN table2.Date ELSE '-' END AS Table2Date 
FROM table1 
CROSS JOIN table2 

如果這仍然不是你在找什麼,我不認爲我明白你的問題在所有。

所有的
+1

對。你有非標準化的表格。垃圾進垃圾出。問題不在於你的查詢,而在於你的數據庫設計。 – Rap 2009-10-01 10:39:50

+0

現在我只能得到與table2.Date列相關的table1.date。我需要Table1.Date,Table1.ID應顯示所有列, Table2.Date應顯示與Table1.Date相關列 – Gopal 2009-10-01 12:06:21

+0

對不起,但我不明白你遇到的問題。給出的答案應該給你在預期輸出下的問題中所描述的結果。 – Jabezz 2009-10-01 12:30:37

2

首先,如果你在table2有不存在的值,則需要使用LEFT OUTER JOIN而不是INNER JOIN。 INNER JOIN by design將只有顯示兩個表都具有值的行,例如,它會過濾掉table2中不存在的任何內容。另外,你沒有加入「日期」 - 這就是爲什麼你會得到比預期更多的結果行。

其次,如果你想在table2顯示的東西比NULL爲不存在的價值一樣,你需要使用ISNULL指定顯示什麼,而不是NULL:

SELECT 
    Table1.Date, Table1.ID, Table2.Date 
FROM table1 
LEFT OUTER JOIN 
    table2 ON table1.id = table2.id AND table1.date = table2.date 
ORDER BY table1.id, table1.date 

我得到的輸出像這樣的:

table1.Date     table1.ID table2.Date 
2009-01-01 00:00:00.000  1   NULL 
2009-01-02 00:00:00.000  1   NULL 
2009-02-03 00:00:00.000  1   NULL 
2009-02-05 00:00:00.000  1   NULL 
2009-04-08 00:00:00.000  1   2009-04-08 00:00:00.000 
2009-05-03 00:00:00.000  1   2009-05-03 00:00:00.000 
2009-01-01 00:00:00.000  2   NULL 
2009-01-02 00:00:00.000  2   NULL 
2009-01-01 00:00:00.000  3   NULL 
2009-01-02 00:00:00.000  3   NULL 

請澄清什麼不好這個輸出....

馬克

+0

我不問有關空列,我需要Table1.Date,Table1.ID應該顯示所有的列,Table2.Date應該顯示與Table1.Date相關的列現在我得到table1.date只與table2.Date列相關。 – Gopal 2009-10-01 12:07:54

+0

我想顯示所有日期,第一張表中的personid,第二張表中與第一張表相關的日期。 – Gopal 2009-10-01 12:55:13

+0

我做一個例子,看我的問題 – Gopal 2009-10-01 12:59:21