1

次の表を想定します。

グループ: (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、名前): {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'}

だから私は製品の完全なビューを作成するつもりです.これは私の最初の試みです:

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全選択クエリを作成していますが、これを行うためのより良い方法はありませんか? この列を最初のビューに結合するようなものですが、それを最もよく実装するための提案は何ですか?

アップデート

ProductDealer表では、英国ProductIdであるため、各製品にはディーラーが 1 人いる場合もあれば、何もない場合もProductDealerあります。

4

4 に答える 4

3
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
于 2012-12-10T14:21:52.350 に答える
1

これが「垂直ユニオン」バージョンです。

WITH "Group"
     AS
     (
      SELECT * 
        FROM (
              VALUES (1,'G1'), (2,'G2'), (3,'G3'), (4, 'G4')
             ) AS T (Id, Title)
     ),
     Category
     AS
     (
      SELECT * 
        FROM (
              VALUES (1, 'Cat1'), (2, 'Cat2'), (3, 'Cat3'), (4, 'Cat4')
             ) AS T (Id, Title)
     ),
     Product
     AS
     (
      SELECT * 
        FROM (
              VALUES (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')
             ) AS T (Id, GroupId, CategoryId, Name)
     ),
     Dealer
     AS
     (
      SELECT * 
        FROM (
              VALUES (1, 'Dealer1'), (2, 'Dealer2'), (3, 'Dealer3')
             ) AS T (Id, Name)
     ),
     ProductDealer 
     AS
     (
      SELECT *
        FROM (
              VALUES (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')
             ) AS T (Id, ProductId, DealerId, Number, LastSale)
     )     
SELECT PR.Id, PR.Name, PR.GroupId, GR.Title AS "Group",
       PR.CategoryId, CA.Title AS Category, 
       PD.Id AS ProductDealerId,
       D.Id DealerId,
       D.Name AS DealerName,
       PD.LastSale AS LastSale,
       PD.Number AS SaleNumber
  FROM Product AS PR
       JOIN "Group" AS GR ON PR.GroupId = GR.Id
       JOIN Category AS CA ON PR.CategoryId = CA.Id
       JOIN ProductDealer AS PD ON PR.Id = PD.ProductId
       JOIN Dealer AS D ON PD.DealerId = D.Id

UNION

SELECT PR.Id, PR.Name, PR.GroupId, GR.Title AS "Group",
       PR.CategoryId, CA.Title AS Category, 
       PD.Id AS ProductDealerId,
       CAST(-1 AS BIGINT) DealerId,
       CAST('HaveNotDealer' AS NVARCHAR) AS DealerName,
       PD.LastSale AS LastSale,
       PD.Number AS SaleNumber
  FROM Product AS PR
       JOIN "Group" AS GR ON PR.GroupId = GR.Id
       JOIN Category AS CA ON PR.CategoryId = CA.Id
       JOIN ProductDealer AS PD ON PR.Id = PD.ProductId
 WHERE PD.DealerId NOT IN ( SELECT Id FROM Dealer )

UNION

SELECT PR.Id, PR.Name, PR.GroupId, GR.Title AS "Group",
       PR.CategoryId, CA.Title AS Category, 
       CAST(-1 AS BIGINT) AS ProductDealerId,
       CAST(-1 AS BIGINT) DealerId,
       CAST('HaveNotDealer' AS NVARCHAR) AS DealerName,
       CAST('0001-01-01 00:00:01' AS DATETIME2) AS LastSale,
       CAST(0 AS BIGINT) AS SaleNumber
  FROM Product AS PR
       JOIN "Group" AS GR ON PR.GroupId = GR.Id
       JOIN Category AS CA ON PR.CategoryId = CA.Id
 WHERE PR.Id NOT IN ( SELECT ProductId FROM ProductDealer );
于 2012-12-11T10:36:38.430 に答える
0

このような:

SELECT 
    [PR].[Id],
    [PR].[Name],
    [PR].[GroupId],
    [GR].[Title] AS [Group],
    [PR].[CategoryId],
    [CA].[Title] AS [Category],
    PD.ID AS ProductDealerID,
    PD.DealerId,
    DE.Name AS Dealer,
    PD.LastSale,
    PD.Number 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 JOIN  ProductDealer AS [PD] ON PD.ProductId = PR.ID
LEFT JOIN  Dealer AS DE ON DE.ID = PD.DealerId
于 2012-12-10T14:26:39.040 に答える