2016-04-03 3 views
-2

Это моя таблица называется Аккаунтымне нужна помощь в отборной оператор запроса

Code   name 
----------- ---------- 
301   Data1 
301001  Data1.1 
109   Data2 
109001  Data2.1 
311   Data3 
311001  Data3.1 

Я хочу, чтобы выбрать все данные + 2 столбцов, чтобы быть, как это, где другие 2 колонки первым будет первым 3 номер в коде и второй будет имя подстроки

Code | name | code2 | name2 
---------------------------------------- 
301 | Data1 | 301 | Data1 
301001 | Data1.2 | 301 | Data1 
109 | Data2 | 109 | Data2 
109001 | Data2.1 | 109 | Data2 
311 | Data3 | 311 | Data3 
311001 | Data3.1 | 311 | Data3 

ответ

0

Прежде всего, это выглядит как структура таблицы не очень хорошо продуманы. Это хорошая идея, чтобы иметь столбец ParentID со ссылкой на родительский счет (столбцы: Id | Код | Наименование | ParentID)

В этом случае запрос будет очень просто:

SELECT N.Code, N.Name, M.Code AS Code2, M.Name AS Name2 
FROM Accounts AS N 
INNER JOIN Accounts AS M ON N.ParentId = M.Id OR N.ParentId IS NULL 

Но, если вы не имеете никакого контроля на структуру базы данных и у вас есть то, что у вас есть - я могу предложить Hacky решение:

SELECT N.Code, N.Name, M.Code AS Code2, M.Name AS Name2 
FROM Accounts AS N 
INNER JOIN Accounts AS M 
    ON N.Code LIKE (M.Code + '%') AND CHARINDEX('.', M.Name) = 0 

См SQL скрипку: http://sqlfiddle.com/#!3/474e2/7

Запрос предполагает, что родительские учетные записи не имеют точек на своем имени!


Другой запрос может быть построена на основе предположения, что код владельца счета всегда короче ребенок счетов:

SELECT N.Code, N.Name, M.Code AS Code2, M.Name AS Name2 
FROM Accounts AS N 
INNER JOIN Accounts AS M 
    ON N.Code LIKE (M.Code + '%') AND LEN(N.Code) >= LEN(M.Code) 

SQL Скрипка: http://sqlfiddle.com/#!3/474e2/9

+0

это помогло мне, но вернуть некоторые избыточные данные –

Смежные вопросы