2015-09-27 1 views
0

с этой схемой:Оптимизировать один ко многим в отношении той же таблицы запроса

CREATE TABLE LookUp 
([docID] varchar(10), [docType] varchar(100), [PartNumber] varchar(100), [internalID] varchar(100)); 
INSERT INTO LookUp 
([docID],[docType],[PartNumber], [internalID]) 
VALUES 
('D0305415', 'docTypeSub', 'X0455', null), 
('D0157632', 'docTypeMain', null, 'XY05570-XY05571'), 
('D0181511', 'docTypeMain',null, 'XY05572-XY05573'), 
('D0157633', 'docTypeMain',null, 'XY06380-XY06381'), 
('D0156037', 'docTypeSub', 'X0326', null), 
('D0151874', 'docTypeMain', null, 'XY05345'); 

CREATE TABLE Links 
([docIDTop] varchar(10), [docIDBottom] varchar(10)); 
INSERT INTO Links 
([docIDTop],[docIDBottom]) 
VALUES 
('D0157632', 'D0305415'), 
('D0181511', 'D0305415'), 
('D0157633', 'D0305415'), 
('D0151874', 'D0156037'); 

Есть ли способ оптимизировать этот запрос без использования вложенной «выбрать», я думаю, что есть способ, но я не могу помните; Таблица Lookup имеет отношение «один-много» внутри, когда doctype - «doctypeSub», есть основная строка, используемая в таблице ссылок для связи с таблицей поиска (снова) с их деталями.

SELECT * FROM 
(SELECT INTERNALID, 
(SELECT PARTNUMBER 
FROM LOOKUP X2 
WHERE X2.DOCID = Z.DOCIDBOTTOM) PARTNUMBER 
FROM LOOKUP X 
INNER JOIN LINKS Z 
ON X.DOCID = Z.DOCIDTOP) TB 
+0

Опишите, что вы хотите, чтобы запрос выполнял? –

ответ

1

Мне сложно определить, что должен делать ваш запрос. Но, я думаю, это эквивалентно:

 SELECT X.INTERNALID, X2.PARTNUMBER 
    FROM LOOKUP X INNER JOIN 
      LINKS Z 
      ON X.DOCID = Z.DOCIDTOP INNER JOIN 
      LOOKUP X2 
      ON X2.DOCID = Z.DOCIDBOTTOM; 
+0

Удивительный, LOL, как я не мог видеть, его время отдыха, спасибо. –

+0

если я думаю, что это вопрос, это очень глупо, могу ли я его стереть ?. –

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