Sql server 使表连接问题?

Sql server 使表连接问题?,sql-server,Sql Server,使用SQLServer2000 有两张桌子的 表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

使用SQLServer2000

有两张桌子的

表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
等等

质疑

输出

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
…
等等

为什么我得到一张桌子1.一次又一次的约会。我想这样展示

预期产量

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) ) 
现在,上面的查询对于access中的预期输出非常有效

如何对此条件进行Sql查询


需要查询帮助

从外观上看,您所缺少的只是加入日期列:

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
如果我没弄错你的问题的话

如果要显示空值,则需要更改为左联接:

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
额外:

我添加了一些额外的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

如果这仍然不是你想要的,我想我根本不理解你的问题。

首先,如果你在
表2中没有值,你需要使用左外连接而不是内连接。“按设计内部联接”仅显示两个表都有值的行,例如,它将过滤掉
表2中不存在的任何内容。此外,您没有在“日期”加入—这就是为什么您得到的结果行比预期的多

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
其次,如果要为
表2
中不存在的值显示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
请澄清此输出的不好之处


马克

为什么要过度杀戮?您可以只说ISNULL(Table2.Name,“-”)而不是嵌入casesAm不询问null列,我需要Table1.Date,Table1.ID应显示所有列,Table2.Date应与Table1一起显示。与日期相关的列现在得到的是Table1.Date与Table2.Date列仅限。@Jabezz,ISNULL不符合ANSI 92,因此,可移植性是一个问题,与CASE-WHEN和coalise不同,它不遵守数据类型优先级规则。我将使用COALESCE。@najmeddine-正在工作谢谢,我忘了在sql server中尝试这个。对。您有非规范化的表。垃圾进来,垃圾出去。问题不在于你的查询,而在于你的数据库设计。现在我得到的是table1.date与table2.date列仅相关。我需要Table1.Date,Table1.ID应显示所有列,Table2.Date应与Table1.Date相关列一起显示对不起,我不理解您遇到的问题。给出的答案应给出问题中“预期输出”下所述的结果。我举一个例子,请参见我的question@Gopal你似乎完全偏离了你原来的问题。SQL Server 2000问题最终是如何翻译我的Access查询以给出不同的结果的?我已经在上面添加了Access翻译,看看它是否适合您。我不是问空列,我需要Table1。Date,Table1.ID应该显示所有列,Table2。Date应该与Table1一起显示。Date相关列现在得到Table1。Date相关列仅限于Table2。Date列。我想显示所有日期,personid来自第一个表,第二个表的日期与第一个表相关。我举了一个例子,请看我的问题是-这正是我的查询应该输出的内容-什么与我的查询不起作用??我的输出是表1。日期,ID,表2。日期10/16/2008 AEAA00294 20081016,10/16/2008 AEAA00294------,10/15/2008 AEAA00294 20081015,10/15/2008 AEAA00294------,2008年10月14日AEAA0029420081014,2008年10月14日AEAA00294------,2008年10月13日AEAA0029420081013,2008年10月13日AEAA00294------,2008年10月12日AEAA00294------,2008年10月11日AEAA00294------,2008年10月10日AEAA00294------,为什么我得到表格1.日期两次问题是什么,我得到了表格1.日期与表格2有关。日期列只能使用左键,我需要Table1.Date,Table1.ID应该显示所有列,Table2.Date应该显示Table1.Date相关列。我将您的access查询翻译到sqlserver,您能告诉我它是否适用于您吗?
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