使用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
….
所以......,
我把“ - ”代替Null Column
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 :(得分: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值,则需要更改为LEFT连接:
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 :(得分:2)
首先,如果table2
中有不存在的值,则需要使用LEFT OUTER JOIN而不是INNER JOIN。 INNER JOIN按设计将仅显示两个表都具有值的行,例如它将过滤掉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
请澄清这个输出有什么不好......
马克
答案 2 :(得分: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