我正在尝试摆脱来自父表的重复记录,我使用自连接。因此,我如何摆脱父表中的重复记录。 我的表结构看起来像这样
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
我希望使用单个类别名称
答案 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