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条记录。