2015-09-27 76 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'); 

有没有办法不使用优化这个查询嵌套的“选择”,我觉得有一种方法,但我不能记住; P。查找表在内部有一对多的关系,当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

真棒,大声笑我怎么看不到,它的时间休息,谢谢。 –

+0

如果我认为这是个问题,那很愚蠢,我可以抹掉它吗? –