2015-01-13 4 views
0

Я хотел бы условно присоединить запрос к себе.Условно присоединяется к запросу

Запрос:

SELECT Part, MtlPart, Qty 
FROM Mtl 

Результат:

Part  MtlPart  Qty 
    1   100   1 
    1   101   2 
    1   102   2 
    2   200   1 
    2   201   1 
100   120   1 
100   121   1 
100   122   1 
120   A20   1 
120   A21   1 

MtlParts также деталей. То, что я хочу сделать, - это присоединить этот запрос к себе, чтобы получить список соединительных частей.

Например:

SELECT * 
FROM 
    (SELECT Part, MtlPart, Qty 
    FROM Mtl) AS A 
INNER JOIN 
    (SELECT Part, MtlPart, Qty 
    FROM Mtl) AS B 
ON a.MtlPartNum = b.PartNum 
WHERE Part = 1 

вернуться бы что-то вроде:

a.Part  a.MtlPart  a.Qty  b.Part  b.MtlPart b.Qty 
     1   100   1   100   120   1 
     1   100   1   100   121   1 
     1   100   1   100   122   1 
     1   101   1   NULL  NULL  NULL 
     1   102   1   NULL  NULL  NULL 

Я хочу присоединиться этот запрос к себе, пока присоединился запрос не возвращает только аннулирует. В этом примере часть 1 вернет данные до тех пор, пока не достигнет MtlParts A20 и A21, потому что они не указаны как части.

Я, честно говоря, не уверен в наилучшем способе этого. Любая помощь или совет ВЕЛИКОЕ оценили.

+0

То, что вы описываете, - это не то, что вам следует преследовать. Наличие динамического количества столбцов, подобных этому, вызовет проблемы, так как вы в конечном итоге попытаетесь вызвать столбцы, которые не существуют. Я бы сказал, что вы должны решить: 1) Только перейти к X вложенным уровням ИЛИ 2) Определить только, когда часть имеет подпункт и обрабатывает обнаружение подчасти в списке через некоторый код за фильтром для набора данных. – KHeaney

+0

@KHeaney option 1 - это то, чего я пытаюсь достичь, но я изо всех сил пытаюсь написать цикл. Какие-либо предложения? – user2572833

ответ

1

Если вы хотите пойти на ограниченное число уровней вложенности, то вы должны просто вернуться в таблице на себе несколько раз, для каждого уровня, а затем выберите один из подкатегория. Это должно выглядеть следующим образом основан на вашем примере:

SELECT A.Part  As APart, 
     A.MtlPart As AMtlPart, 
     A.Qty  As AQty, 
     B.Part  As BPart, 
     B.MtlPart As BMtlPart, 
     B.Qty  As BQty, 
     C.Part  As CPart, 
     C.MtlPart As CMtlPart, 
     C.Qty  As CQty, 
FROM Mtl AS A 
    Left Outer JOIN Mtl AS B 
     ON A.MtlPartNum = B.Part 
    Left Outer JOIN Mtl AS C 
     ON B.MtlPartNum = C.Part 
WHERE A.Part = 1 

Это будет производить набор результатов

APart  AMtlPart AQty BPart  BMtlPart BQty CPart CMtlPart CQty 
1   100  1  100  120  1  120  A20  1 
1   100  1  100  120  1  120  A21  1 
1   100  1  100  121  1  Null Null  Null 
1   100  1  100  122  1  Null Null  Null 
1   101  1  Null  Null  Null Null Null  Null 
1   102  1  Null  Null  Null Null Null  Null 

Добавляя более Joins вы можете увеличить, насколько глубоко вы смотрите. Как я уже упоминал в своем комментарии, вы не должны делать это динамически. Это означало бы, что вы ограничены количеством объединений, которые вы выбираете для написания, поэтому этот метод будет работать лучше всего, если вы знаете, сколько уровней вы хотели бы изучить в части части.

+0

К сожалению, количество необходимых вложенных уровней будет отличаться. Это похоже на мой текущий код и работает корректно, но я искал способ его создания. Я не был уверен, что это возможно или нет. Благодарим вас за помощь, и, пожалуйста, дайте мне знать, если вам удастся найти способ сделать это динамически. – user2572833

1

Ваш запрос выглядит как разумный подход, хотя вам, похоже, требуется внешнее соединение, а не внутреннее соединение. Я хотел бы устранить подзапросы и псевдонимы:

SELECT a.Part, a.MtlPart, a.Qty, b.Part, b.MtlPart, b.Qty 
FROM Mtl A LEFT JOIN 
    Mtl B 
    ON a.MtlPartNum = b.PartNum 
WHERE A.Part = 1; 
Смежные вопросы