多次连接表的 LINQ 问题

发布于 2024-12-04 01:52:23 字数 1566 浏览 2 评论 0原文

我继承了一个模式,我需要使用它来处理一些sql。它是为了展示产品的变化,例如毛衣的颜色和尺寸变化。该架构有 1 个产品表:

TABLE tbl_Product

[ProductID] [int],
[Quantity] [int],
[Title] [nvarchar](500),
[Description] [varchar](max),
[Price] [money]  

等...

另一个表作为变体的链接表

TABLE tbl_ProductVariation

[ProductVariationID] [int],
[ProductID] [int] ,
[VariationID] [int]  

和变体表

TABLE tbl_Variation,

[VariationID] [int],
[VariationTypeID] [int] NOT NULL,
[USTitle] [nvarchar](150) NULL,
[UKTitle] [nvarchar](150) NULL

因此变体值可以包含取决于variationtypeid的颜色或尺寸

那么为什么这个查询会失败??

SELECT [t4].[ProductVariationID], [t5].[UKTitle] AS [Size], 
       [t6].[UKTitle] AS [Colour], [t0].[Title]
FROM [dbo].[tbl_Product] AS [t0]
INNER JOIN [dbo].[tbl_ProductCategory] AS [t1] 
    ON [t0].[ProductID] = [t1].[ProductID]
INNER JOIN [dbo].[vw_ProductImage] AS [t2] 
    ON [t0].[ProductID] = [t2].[ProductID]
INNER JOIN [dbo].[tbl_Brand] AS [t3] 
    ON [t0].[BrandID] = [t3].[BrandID]
INNER JOIN [dbo].[tbl_ProductVariation] AS [t4] 
    ON [t0].[ProductID] = [t4].[ProductID]
LEFT OUTER JOIN [dbo].[tbl_Variation] AS [t5] 
    ON [t5].[VariationID] = [t4].[VariationID]
LEFT OUTER  JOIN [dbo].[tbl_Variation] AS [t6] 
    ON  [t6].[VariationID] = [t4].[VariationID] 
INNER JOIN [dbo].[tbl_Category] AS [t7] 
    ON [t1].[CategoryID] = [t7].[CategoryID]
WHERE ([t5].[VariationTypeID] IN(2))
AND ([t6].[VariationTypeID] IN(1))

I have inherited a schema which I need to get some sql working on. It is to show a products variation such as colour and size variants of jumper. The schema has 1 table for products :

TABLE tbl_Product

[ProductID] [int],
[Quantity] [int],
[Title] [nvarchar](500),
[Description] [varchar](max),
[Price] [money]  

etc...

another table as a linking table for the variations

TABLE tbl_ProductVariation

[ProductVariationID] [int],
[ProductID] [int] ,
[VariationID] [int]  

and the variation table

TABLE tbl_Variation

[VariationID] [int],
[VariationTypeID] [int] NOT NULL,
[USTitle] [nvarchar](150) NULL,
[UKTitle] [nvarchar](150) NULL

so the variation value can contain a colour or a size depending on the variationtypeid

so why does this query fail ??

SELECT [t4].[ProductVariationID], [t5].[UKTitle] AS [Size], 
       [t6].[UKTitle] AS [Colour], [t0].[Title]
FROM [dbo].[tbl_Product] AS [t0]
INNER JOIN [dbo].[tbl_ProductCategory] AS [t1] 
    ON [t0].[ProductID] = [t1].[ProductID]
INNER JOIN [dbo].[vw_ProductImage] AS [t2] 
    ON [t0].[ProductID] = [t2].[ProductID]
INNER JOIN [dbo].[tbl_Brand] AS [t3] 
    ON [t0].[BrandID] = [t3].[BrandID]
INNER JOIN [dbo].[tbl_ProductVariation] AS [t4] 
    ON [t0].[ProductID] = [t4].[ProductID]
LEFT OUTER JOIN [dbo].[tbl_Variation] AS [t5] 
    ON [t5].[VariationID] = [t4].[VariationID]
LEFT OUTER  JOIN [dbo].[tbl_Variation] AS [t6] 
    ON  [t6].[VariationID] = [t4].[VariationID] 
INNER JOIN [dbo].[tbl_Category] AS [t7] 
    ON [t1].[CategoryID] = [t7].[CategoryID]
WHERE ([t5].[VariationTypeID] IN(2))
AND ([t6].[VariationTypeID] IN(1))

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想挽留 2024-12-11 01:52:23

如果“失败”意味着您的“左外连接”似乎不起作用,您可以尝试此查询。

SELECT [t4].[ProductVariationID],
       [t5].[UKTitle] AS [Size],
       [t6].[UKTitle] AS [Colour],
       [t0].[Title]
FROM   [dbo].[tbl_Product] AS [t0]
       INNER JOIN [dbo].[tbl_ProductVariation] AS [t4]
         ON [t0].[ProductID] = [t4].[ProductID]
       LEFT OUTER JOIN [dbo].[tbl_Variation] AS [t5]
         ON [t5].[VariationID] = [t4].[VariationID] AND
            [t5].VariationTypeID IN(2)
       LEFT OUTER JOIN [dbo].[tbl_Variation] AS [t6]
         ON [t6].[VariationID] = [t4].[VariationID] AND
            [t6].[VariationTypeID] IN(1)

我将对 VariationTypeID 的检查移至 join 子句。将它们放在 where 子句中会使外连接的行为类似于内连接。

If by fail you mean that your left outer join does not seem to work you could try this query instead.

SELECT [t4].[ProductVariationID],
       [t5].[UKTitle] AS [Size],
       [t6].[UKTitle] AS [Colour],
       [t0].[Title]
FROM   [dbo].[tbl_Product] AS [t0]
       INNER JOIN [dbo].[tbl_ProductVariation] AS [t4]
         ON [t0].[ProductID] = [t4].[ProductID]
       LEFT OUTER JOIN [dbo].[tbl_Variation] AS [t5]
         ON [t5].[VariationID] = [t4].[VariationID] AND
            [t5].VariationTypeID IN(2)
       LEFT OUTER JOIN [dbo].[tbl_Variation] AS [t6]
         ON [t6].[VariationID] = [t4].[VariationID] AND
            [t6].[VariationTypeID] IN(1)

I moved the checks on VariationTypeID to the join clause instead. Having them in the where clause makes your outer join's behave like inner joins.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文