首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL DB问题

SQL DB问题
EN

Stack Overflow用户
提问于 2010-10-28 01:10:48
回答 5查看 66关注 0票数 0

关于SQL视图的问题。尝试从两个表开发视图。这两个表有相同的主键,除了第一个表有所有主键外,第二个表有一些主键,但不是全部。当我对它们进行内部连接时,我得到了一个记录集,但它并不完整,因为第二个表并不包含所有的记录。在我的视图中,有没有一种方法可以编写逻辑,声明如果键不在表#2中,插入一个零,那么整个记录集就会显示在视图中?我想要显示视图中的所有记录,即使没有要进行内连接的内容。

下面是我的例子:

代码语言:javascript
复制
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'))
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-28 01:22:25

是的,你可以做到。假设baan_view1b有所有的记录和注释,只有一些,更改

代码语言:javascript
复制
 FROM dbo.Baan_view1b INNER JOIN dbo.notes

可以这么说

代码语言:javascript
复制
 FROM dbo.Baan_view1b LEFT OUTER JOIN dbo.notes

内部联接(或简单的普通联接)告诉数据库引擎从Baan_view1b中获取记录,将它们与notes中的记录进行匹配,并在输出中为每对匹配的记录包括一行。如您所见,它从Baan_view1b中排除了在notes表中没有匹配项的记录。

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

如果像往常一样,从两个表中请求列值,则连接右侧的表中的列在缺少的行中将具有空值。

票数 1
EN

Stack Overflow用户

发布于 2010-10-28 01:14:02

您要查找的是左连接(左外连接),而不是内连接

代码语言:javascript
复制
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子句可以提高查询效率。

票数 5
EN

Stack Overflow用户

发布于 2010-10-28 01:14:43

inner join更改为left outer join

(如果你觉得花哨,也可以买一部right outer joinfull outer join。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4035799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档