Как получить записи без дублирования, используя Inner Join в SQL - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь избавиться от дубликатов записей, исходящих из родительской таблицы, я использую self join.так как я могу избавиться от дубликатов записей из родительской таблицы.Структура моей таблицы. Посмотрите, как здесь* Я использую этот запрос

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

I Ожидается одно имя категории Как этот

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

Как уже сказал вам Гордон Линофф: вы должны делать это в своем приложении, а не в своей БД.

Вот пример, почему ваша идея может вызвать проблемы:

// 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
0 голосов
/ 26 апреля 2019

"tmp" part - таблица для проверки запроса. Вам это не нужно, это для других читателей:)

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...