Vb.net 在MS-SQL中,如何从主表中获取所有行,从详细表中获取相关行?

Vb.net 在MS-SQL中,如何从主表中获取所有行,从详细表中获取相关行?,vb.net,sql-server-2008,select,Vb.net,Sql Server 2008,Select,我正在使用MS-SQL,并试图编写一个查询,从主表中获取行,从详细表中获取相关行。现在,我想要的是它必须只从主表中获取第一行,并且从详细表中获取的相关字段在第一行中应该为空,现在如果在详细表中找到相关行,那么它们必须显示在单独的行中。我一直在尝试使用下面的查询,但它没有给出期望的结果 SELECT DISTINCT ProductMaster.ProductMasterID, ProductMaster.ProductName, ProductMaster

我正在使用MS-SQL,并试图编写一个查询,从主表中获取行,从详细表中获取相关行。现在,我想要的是它必须从主表中获取第一行,并且从详细表中获取的相关字段在第一行中应该为空,现在如果在详细表中找到相关行,那么它们必须显示在单独的行中。我一直在尝试使用下面的查询,但它没有给出期望的结果

SELECT 
      DISTINCT 
      ProductMaster.ProductMasterID, ProductMaster.ProductName,
      ProductMaster.SubCategoryID, SubCategory.SubCategoryName,
      ProductBrandAndType.ProductBranAndTypeID, ProductBrandAndType.ProductType,
      ProductBrandAndType.Brand, ProductMaster.ProductDesc, 
      ProductMaster.ReOrderLevel 
FROM 
   ProductBrandAndType 
RIGHT OUTER JOIN 
   Inward 
ON ProductBrandAndType.ProductBranAndTypeID = Inward.ProductBrandAndTypeID 
RIGHT OUTER JOIN 
   ProductMaster 
ON Inward.ProductID = ProductMaster.ProductMasterID 
LEFT OUTER JOIN 
   SubCategory 
ON ProductMaster.SubCategoryID = SubCategory.SubCategoryID 
ORDER BY 
      ProductMaster.ProductName, 
      ProductBrandAndType.ProductType, 
      ProductBrandAndType.Brand;
有人能帮我吗

问候


Sikandar

如果您只需要ProductMaster的第一行。然后你可以这样做:

;WITH CTE
(
    SELECT
        ROW_NUMBER() OVER(ORDER BY ProductMaster.ProductMasterID) AS RowNbr,
        ProductMaster.ProductName,
        ProductMaster.SubCategoryID,
        ProductMaster.ProductDesc, 
        ProductMaster.ReOrderLevel 
    FROM
        ProductMaster
)
SELECT
      ProductMaster.ProductMasterID, 
      ProductMaster.ProductName,
      ProductMaster.SubCategoryID, 
      SubCategory.SubCategoryName,
      ProductBrandAndType.ProductBranAndTypeID, 
      ProductBrandAndType.ProductType,
      ProductBrandAndType.Brand, 
      ProductMaster.ProductDesc, 
      ProductMaster.ReOrderLevel 
FROM 
   ProductBrandAndType 
RIGHT OUTER JOIN Inward 
    ON ProductBrandAndType.ProductBranAndTypeID = Inward.ProductBrandAndTypeID 
RIGHT OUTER JOIN CTE AS ProductMaster
    ON Inward.ProductID = ProductMaster.ProductMasterID
    AND RowNbr=1 
LEFT OUTER JOIN SubCategory 
    ON ProductMaster.SubCategoryID = SubCategory.SubCategoryID 
ORDER BY 
    ProductMaster.ProductName, 
    ProductBrandAndType.ProductType, 
    ProductBrandAndType.Brand;

下面的查询成功了

SELECT     dbo.ProductMaster.ProductMasterID, dbo.ProductMaster.ProductName, dbo.ProductMaster.SubCategoryID, dbo.ProductMaster.ProductDesc, 
                      dbo.ProductMaster.ReOrderLevel, null as ProductBrandAndTypeID,  
                      null AS Type, null as Brand
FROM         dbo.ProductBrandAndType RIGHT OUTER JOIN
                      dbo.Inward ON dbo.ProductBrandAndType.ProductBranAndTypeID = dbo.Inward.ProductBrandAndTypeID RIGHT OUTER JOIN
                      dbo.ProductMaster ON dbo.Inward.ProductID = dbo.ProductMaster.ProductMasterID LEFT OUTER JOIN
                      dbo.SubCategory ON dbo.ProductMaster.SubCategoryID = dbo.SubCategory.SubCategoryID
UNION 
SELECT     dbo.ProductMaster.ProductMasterID, dbo.ProductMaster.ProductName, dbo.ProductMaster.SubCategoryID, dbo.ProductMaster.ProductDesc, 
                      dbo.ProductMaster.ReOrderLevel, dbo.ProductBrandAndType.ProductBranAndTypeID,  
                      dbo.ProductBrandAndType.ProductType, dbo.ProductBrandAndType.Brand
FROM         dbo.ProductBrandAndType RIGHT OUTER JOIN
                      dbo.Inward ON dbo.ProductBrandAndType.ProductBranAndTypeID = dbo.Inward.ProductBrandAndTypeID RIGHT OUTER JOIN
                      dbo.ProductMaster ON dbo.Inward.ProductID = dbo.ProductMaster.ProductMasterID LEFT OUTER JOIN
                      dbo.SubCategory ON dbo.ProductMaster.SubCategoryID = dbo.SubCategory.SubCategoryID                      
ORDER BY ProductName;   

这是一种有效的表示方式,在报表生成器/格式化程序中比在SQL中处理得更好。