2010-10-27 77 views
0

关于SQL View的问题。尝试从两个表格开发视图。这两个表具有相同的主键,第一个表包含全部的第二个表,第二个表具有一些,但不是全部。当我INNER加入他们时,我得到一个记录集,但它没有完成,因为第二个表格不包含所有记录。在我看来,有一种方法可以编写逻辑,指出如果键不存在,那么表#2插入一个零,以便整个记录集显示在视图中?即使没有任何内部连接,我也不会显示视图中的所有记录。SQL数据库问题

我下面的例子:

SELECT  dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, dbo.Baan_view1b.[User], 
         dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage, MAX(dbo.notes.percent_developed) AS Expr1 
FROM   dbo.Baan_view1b INNER JOIN 
         dbo.notes ON dbo.Baan_view1b.Number = dbo.notes.note_number 
GROUP BY dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, dbo.Baan_view1b.[User], 
         dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage 
HAVING  (NOT (dbo.Baan_view1b.stage LIKE 'Closed')) 

回答

1

是的,你可以这样做。假设baan_view1b了所有记录,笔记只是一些改变

FROM dbo.Baan_view1b INNER JOIN dbo.notes 

FROM dbo.Baan_view1b LEFT OUTER JOIN dbo.notes 

INNER JOIN(或只是简单的JOIN)告诉数据库引擎把记录从Baan_view1b,与它们匹配记录在笔记中,并在输出中为匹配的每对记录添加一行。如您所见,它排除Baan_view1b中记录表中没有匹配项的记录。

LEFT OUTER JOIN反而告诉引擎从Bann_view1b获取所有记录(因为它位于JOIN关键字的左侧)。然后,它会在任何可能的地方匹配记录。但是,无论是否可以匹配,您都可以保证左侧表格中每行的输出都有一行。

如果您像往常一样询问两个表中的列值,则JOIN右侧表格中的列将在缺少的行中具有NULL值。

+0

感谢您解释它。我做到了,它效果很棒!感谢球员的一切! – GabrielVa 2010-10-27 17:42:10

5

你正在寻找的是左连接(左外连接),而不是内部联接

SELECT dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, 
     dbo.Baan_view1b.[User], dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage, 
     MAX(dbo.notes.percent_developed) AS Expr1 
FROM dbo.Baan_view1b 
    LEFT OUTER JOIN dbo.notes 
     ON dbo.Baan_view1b.Number = dbo.notes.note_number 
WHERE NOT dbo.Baan_view1b.stage LIKE 'Closed'  
GROUP BY dbo.Baan_view1b.Number, dbo.Baan_view1b.description, dbo.Baan_view1b.system, dbo.Baan_view1b.Analyst, 
     dbo.Baan_view1b.[User], dbo.Baan_view1b.[Date Submitted], dbo.Baan_view1b.category, dbo.Baan_view1b.stage 

此外,更改HAVING子句到哪里是什么子句使查询更高效。

1

inner join更改为left outer join

(或者right outer joinfull outer join如果你觉得幻想。)

0

你需要一个外连接。这显示了所有具有匹配键的记录以及不匹配的记录。内部联接仅显示具有匹配连接键的记录。

享受!

0

您需要做一个左外部加入其他海报已经提到过。更多信息可以在here找到。