如何在SQL中使用内部联接获取不重复的记录

时间:2019-04-26 10:50:41

标签: c# sql sql-server asp.net-mvc

我正在尝试摆脱来自父表的重复记录,我使用自连接。因此,我如何摆脱父表中的重复记录。 我的表结构看起来像这样

ID      CategoryName    ParentID    IsActive
----+----------------+-----------+-----------
1   |   Toyota       |   NULL    |     1    
2   |   Honda        |   NULL    |     1    
3   |   Mitsubhi     |   NULL    |     1    
4   |   Toyota GLI   |     1     |     1    
5   |   Toyota XLI   |     1     |     1    
6   |   Swift        |     1     |     1    
7   |   Honda Civic  |     2     |     1    
8   |   Honda City   |     2     |     1    

我已经尝试通过命令和命令与group进行自我连接,但是现在可以使用

select a.CatogoryName,b.CatogoryName
from CategoryInfo a inner join
     CategoryInfo b
     on a.Id= b.ParentId
Group By a.CatogoryName, b.CatogoryName

结果

Category Name     Model
Honda             Honda City
Honda             Honda Civic
Toyota            Swift
Toyota            Toyota GLI
Toyota            Toyota XLI

我使用此查询

select a.CatogoryName, b.CatogoryName
from CategoryInfo a inner join
     CategoryInfo b
     on a.Id = b.ParentId 

结果

Category Name     Model
Honda             Honda City
Honda             Honda Civic
Toyota            Swift
Toyota            Toyota GLI
Toyota            Toyota XLI

预期结果

Category Name     Model
Honda             Honda City
                  Honda Civic
Toyota            Swift
                  Toyota GLI
                  Toyota XLI

我希望使用单个类别名称

2 个答案:

答案 0 :(得分:0)

“ tmp”部分-用于检查查询的表。您不需要它,它适合其他读者:)

CREATE TABLE #tmpCatInfo (ID int, CategoryName varchar(55), ParentID int, IsActive int)
INSERT INTO #tmpCatInfo 
SELECT * FROM (VALUES (1, 'Toyota', NULL, 1)
                     ,(2, 'Honda', NULL, 1)
                     ,(3, 'Mitsubhi', NULL, 1)
                     ,(4, 'Toyota GLI', 1, 1)
                     ,(5, 'Toyota XLI', 1, 1)
                     ,(6, 'Swift', 1, 1)
                     ,(7, 'Honda Civic', 2, 1)
                     ,(8, 'Honda City', 2, 1)) a(ID, CategoryName, ParentID, IsActive)
;

-- USE THIS PART
-- Change #tmpCatInfo on your table name

WITH CategoryInfo (ID, CategoryName, IsActive, Model)
AS
(
SELECT ci.ID            as ID
     , ci.CategoryName  as CategoryName
     , ci2.IsActive     as IsActive
     , ci2.CategoryName as Model
FROM #tmpCatInfo ci
JOIN #tmpCatInfo ci2 ON ci.ID = ci2.ParentID
)

SELECT CASE 
         WHEN row_number() over (PARTITION BY CategoryName ORDER BY (SELECT NULL)) = 1
         THEN CategoryName
       END AS 
      CatogoryName
    , Model
FROM CategoryInfo

-- USE THIS PART

答案 1 :(得分:0)

就像Gordon Linoff已经告诉您的那样:您应该在应用程序中而不是在数据库中这样做。

以下是您的想法会引起麻烦的示例:

// Let's create a DataTable which holds the recors you want to get from the db
DataTable dt = new DataTable();
dt.Columns.Add("Category Name");
dt.Columns.Add("Model");

// Let's put in data
dt.Rows.Add(new[] { "Honda", "Honda City" });
dt.Rows.Add(new[] { null, "Honda Civic" });
dt.Rows.Add(new[] { "Toyota", "Swift" });
dt.Rows.Add(new[] { null, "Toyota GLI" });
dt.Rows.Add(new[] { null, "Toyota XLI" });

// dt is now what you want to get from your db.

// Let's see what we got:
Console.WriteLine(dt.Columns[0].ColumnName.PadRight(20) + dt.Columns[1].ColumnName.PadRight(20)); // PadRight to make it look better..
foreach (DataRow item in dt.Rows)
{
    Console.WriteLine((item[0] + "").PadRight(20) + (item[1] + "").PadRight(20));
}

我们得到了您想要的输出:

Category Name       Model
Honda               Honda City
                    Honda Civic
Toyota              Swift
                    Toyota GLI
                    Toyota XLII

但是您不能使用此数据。让我们看看如果您用它在应用程序中执行某些操作会发生什么情况:

Console.WriteLine("".PadRight(50, '-')); // Horizontal line to see 1st and 2nd output better

// Now we want to play with our data, by removing the 3rd Row:
dt.Rows.RemoveAt(2); // Index 2 is the 3rd row

// Let's see what we got after removing:
Console.WriteLine(dt.Columns[0].ColumnName.PadRight(20) + dt.Columns[1].ColumnName.PadRight(20)); // PadRight to make it look better..
foreach (DataRow item in dt.Rows)
{
    Console.WriteLine((item[0] + "").PadRight(20) + (item[1] + "").PadRight(20));
}

输出显示本田类别中的所有丰田汽车:

Category Name       Model
Honda               Honda City
                    Honda Civic
                    Toyota GLI
                    Toyota XLI