SQL DB问题

时间:2010-10-27 17:10:48

标签: sql view

有关SQL View的问题。试图从两个表开发视图。这两个表有相同的主键,execpt第一个表有所有,第二个有一些,但不是全部。当我INNER加入他们时,我得到一个记录集,但它不完整,因为第二个表中没有所有记录。在我的视图中是否有一种方法可以编写逻辑,声明如果键不存在于表#2中以插入零,那么整个记录集将显示在视图中?我想在视图中显示所有记录,即使内部连接没有任何内容。

我的例子如下:

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'))

5 个答案:

答案 0 :(得分: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子句更改为WHERE子句可以提高查询效率。

答案 1 :(得分:1)

inner join更改为left outer join

(或right outer joinfull outer join,如果您觉得有点想要的话。)

答案 2 :(得分: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获取记录,将它们与notes中的记录匹配,并在输出中为每对匹配的记录包含一行。如您所见,它排除了Baan_view1b中记录表中没有匹配项的记录。

LEFT OUTER JOIN代替告诉引擎从Bann_view1b获取所有记录(因为它位于JOIN关键字的左侧)。然后,它将匹配记录中的记录,只要它可以。但是,无论是否可以匹配,左边表中的每一行都会保证输出中的一行。

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

答案 3 :(得分:0)

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

享受!

答案 4 :(得分:0)

你需要像其他海报已经提到的那样进行左外连接。可以找到更多信息here