制表加入问题?

时间:2009-10-01 10:23:01

标签: sql-server

使用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查询?

需要查询帮助

3 个答案:

答案 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