有关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'))
答案 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 join
或full 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。