Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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_Sql Server_Sql Server 2008 - Fatal编程技术网

SQL左连接并包含空记录

SQL左连接并包含空记录,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个类似以下的问题: SELECT * FROM dbo.Item AS i LEFT JOIN dbo.ItemSpecific AS is ON i.ID = is.ID dbo.Item ID Name Description dbo.ItemSpecfic ID ItemID Name Description 正如您将注意到的,dbo.ItemSpecific表包含与dbo.Item表相同的列。如果在帐户级别对某个项目进行了自定义,则详细信息将显示在dbo.itemsspec

我有一个类似以下的问题:

SELECT *
FROM dbo.Item AS i
LEFT JOIN dbo.ItemSpecific AS is ON i.ID = is.ID


dbo.Item
ID
Name
Description

dbo.ItemSpecfic
ID
ItemID
Name
Description
正如您将注意到的,dbo.ItemSpecific表包含与dbo.Item表相同的列。如果在帐户级别对某个项目进行了自定义,则详细信息将显示在dbo.itemsspecific表中,否则,如果帐户仅使用标准项目,则根本不会有dbo.itemsspecific记录

我想做的是获取每个帐户的所有特定记录的列表,以及如果没有自定义,帐户将使用的标准项目记录。有没有一种方法可以在单个查询中实现这一点,或者联合是我唯一的选择?现在使用左连接时,如果存在任何自定义,则不会返回常规dbo.Item记录,因为此时连接已完成

我想要的数据示例如下:

ItemID       ItemSpecificID       Name         Description
1                   1             'Test'         'Test'
2                  NULL           'Test2'        'Test2'
2                   2             'Test3'        'Test3'
2                   3             'Test4'         'Test4'
试试这个

SELECT i.ID,
       isp.ItemSpecificID,
       Isnull(isp.Name, i.Name) Name,
       Isnull(isp.[Description], i.[Description]) [Description]
FROM dbo.Item AS i
LEFT outer JOIN dbo.ItemSpecific AS isp ON i.ID = isp.ItemID
是你的朋友

FROM
    dbo.Item I
    FULL OUTER JOIN dbo.ItemSpecific IS ON I.Id = IS.ItemID


COALESCE是你的朋友你能展示一个你想要的结果的例子吗?我使用COALESCE在需要的地方获取特定于项目的列,但我也需要单独的记录作为结果的单独记录。只是一个简短的评论:不要使用
is
作为别名;这是一种不好的做法(因为
IS
对SQL来说意味着一些东西,例如,
中的IS NULL
)。添加了示例,您会注意到项目2有两个特定于帐户的项目,但它仍然显示管理记录。问题是,左连接正在一起删除项目记录,因为满足了连接,所以在上面的示例中,ItemID 2将只显示2条记录,而不是3条。@mameesh我认为这是正确的,您检查了吗?,请注意返回完全相同结果的是
左外部联接
而不是
左联接
,左连接和左外部连接在SQL中是完全相同的。您的问题可能与两个表中具有相似名称的列有关,如果有数据,则执行
select*
@mameesh,然后运行查询并告诉结果。这也不起作用。我相信这是同样的事实,它已经满足了连接,因为dbo.ItemSpecific表中有该项的记录,所以它只返回2条记录。