Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL数据库问题_Sql_View - Fatal编程技术网

SQL数据库问题

SQL数据库问题,sql,view,Sql,View,关于SQL视图的问题。尝试从两个表开发视图。这两个表有相同的主键,第一个表有全部主键,第二个表有一些主键,但不是全部主键。当我内部连接它们时,我会得到一个记录集,但它并不完整,因为第二个表中没有所有的记录。在我看来,有没有一种方法可以编写逻辑,说明如果表#2中没有键,那么可以插入一个零,这样整个记录集都会显示在视图中?我想显示视图中的所有记录,即使没有要连接的内容 我的例子如下: SELECT dbo.Baan_view1b.Number, dbo.Baan_view1b.descrip

关于SQL视图的问题。尝试从两个表开发视图。这两个表有相同的主键,第一个表有全部主键,第二个表有一些主键,但不是全部主键。当我内部连接它们时,我会得到一个记录集,但它并不完整,因为第二个表中没有所有的记录。在我看来,有没有一种方法可以编写逻辑,说明如果表#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'))

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

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子句可以提高查询效率。

内部联接更改为
左侧外部联接


(或
右外部联接
完全外部联接
,如果您愿意)。

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


享受吧

你需要做一个左外连接,正如其他海报已经提到的那样。可以找到更多信息

是的,你可以这样做。假设baan_view1b拥有所有记录,而notes只有一些更改

 FROM dbo.Baan_view1b INNER JOIN dbo.notes

 FROM dbo.Baan_view1b LEFT OUTER JOIN dbo.notes
内部连接(或简单连接)告诉数据库引擎从Baan_view1b中获取记录,将它们与notes中的记录匹配,并在输出中为每对匹配的记录包含一行。如您所见,它排除了Baan_view1b中notes表中不匹配的记录

左外部联接则告诉引擎从Bann_view1b获取所有记录(因为它位于联接关键字的左侧)。然后,它将尽可能匹配notes中的记录。但是,不管是否可以匹配,都可以保证左侧表中每一行的输出中都有一行


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

感谢您的解释。我做到了,效果很好!谢谢你们所做的一切!