假设这些表:
组:(Id,标题):{1,G1}, {2,G2}, {3,G3}, {4, G4}
类别:(Id,标题):{1, Cat1}, {2, Cat2}, {3, Cat3}, {4, Cat4}
产品:(Id、GroupId、CategoryId、名称):
{1, 1, 1, G1C1P1},
{2, 1, 2, G1C2P2},
{3, 1, 2, G1C2P3},
{4, 2, 2, G2C2P4},
{5, 2, 2, G2C2P5},
{6, 3, 1, G3C1P6},
{7, 3, 3, G3C3P7}
经销商: (Id, Name): {1, 'Dealer1'}, {2, 'Dealer2'}, {3, 'Dealer3'}
ProductDealer(Id、ProductId(英国)、DealerId、LastSale、Number):
{1, 1, 1, 5, '2012-12-10 12:34:31'},
{2, 2, 2, 120, '2012-11-10 12:34:31'},
{3, 5, 1, 75, '2012-12-02 12:34:31'}
所以我要创建产品的完整 View ,这是我的第一次尝试:
SELECT
[PR].[Id],
[PR].[Name],
[PR].[GroupId],
[GR].[Title] AS [Group],
[PR].[CategoryId],
[CA].[Title] AS [Category]
FROM [dbo].[Product] AS [PR]
INNER JOIN [dbo].[Group] AS [GR] ON [PR].[GroupId] = [GR].[Id]
INNER JOIN [dbo].[Category] AS [CA] ON [PR].[CategoryId] = [CA].[Id]
然后我想添加ProductDealer
列来查看,所以我试试这个:
SELECT
[PR].[Id],
[PR].[Name],
[PR].[GroupId],
[GR].[Title] AS [Group],
[PR].[CategoryId],
[CA].[Title] AS [Category],
ISNULL(
(SELECT [PD].[Id] FROM [dbo].[ProductDealer] AS [PD]
WHERE [PD].[ProductId] = [PR].[Id]),
CAST(-1 AS BIGINT)
) AS [ProductDealerId],
ISNULL(
(SELECT [DE].[Id] FROM [dbo].[Dealer] AS [DE]
INNER JOIN [dbo].[ProductDealer] AS [PD] ON [DE].[Id] = [PD].[DealerId]
WHERE [PD].[ProductId] = [PR].[Id]),
CAST(-1 AS BIGINT)
) AS [DealerId],
ISNULL(
(SELECT [DE].[Name] FROM [dbo].[Dealer] AS [DE]
INNER JOIN [dbo].[ProductDealer] AS [PD] ON [DE].[Id] = [PD].[DealerId]
WHERE [PD].[ProductId] = [PR].[Id]),
CAST('HaveNotDealer' AS NVARCHAR)
) AS [Dealer],
ISNULL(
(SELECT [PD].[LastSale] FROM [dbo].[ProductDealer] AS [PD]
WHERE [PD].[ProductId] = [PR].[Id]),
CAST('0001-01-01 00:00:01' AS DATETIME2)
) AS [LastSale],
ISNULL(
(SELECT [PD].[Number] FROM [dbo].[ProductDealer] AS [PD]
WHERE [PD].[ProductId] = [PR].[Id]),
CAST(0 AS BIGINT)
) AS [SaleNumber]
FROM [dbo].[Product] AS [PR]
INNER JOIN [dbo].[Group] AS [GR] ON [PR].[GroupId] = [GR].[Id]
INNER JOIN [dbo].[Category] AS [CA] ON [PR].[CategoryId] = [CA].[Id]
如您所见,对于 ProductDealer
中的每一列,我编写了一个完整的选择查询,我不知道是否有更好的方法来执行此操作?将这些列合并到第一个 View 之类的东西,你对最好地实现它有什么建议?
更新
在 ProductDealer
表中,ProductId
是英国的,所以每个产品可能有一个经销商或没有,如果产品有经销商,我想得到 ProductDealer
列在 View 中,如果没有,则获取我的默认值,如:(-1, 'HaveNotDealer')。
最佳答案
SELECT
[PR].[Id],
[PR].[Name],
[PR].[GroupId],
[GR].[Title] AS [Group],
[PR].[CategoryId],
[CA].[Title] AS [Category],
ISNULL([PD].[Id],
CAST(-1 AS BIGINT)) AS [ProductDealerId],
ISNULL([D].Id,
CAST(-1 AS BIGINT)) as DealerId,
ISNULL([D].Name,
CAST('HaveNotDealer' AS NVARCHAR)) as DealerName,
ISNULL(PD.LastSale,
CAST('0001-01-01 00:00:01' AS DATETIME2)) as LastSale,
ISNULL([PD].Number,
CAST(0 AS BIGINT)) as SaleNumber
FROM [dbo].[Product] AS [PR]
INNER JOIN [dbo].[Group] AS [GR] ON [PR].[GroupId] = [GR].[Id]
INNER JOIN [dbo].[Category] AS [CA] ON [PR].[CategoryId] = [CA].[Id]
LEFT OUTER JOIN [dbo].[ProductDealer] AS [PD] ON [PR].[Id] = [PD].[ProductId]
LEFT OUTER JOIN [dbo].[Dealer] AS [D] ON [PD].DealerId = [D].Id
关于sql - SQL 中垂直联合列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801450/