需要从Left outer join获取特定数据

时间:2015-12-15 13:18:30

标签: sql-server

假设我有四张桌子 使用以下结构的主要,父级,子级,父级制作

enter image description here

如果ConfigTable列值为Parent或Child,则StageId将为ParentId或ChildId。

现在我必须使用所有其他表在主表上执行左外连接,并且需要像

这样的数据

结果集

  • MT.ID
  • PT.Code
  • CH.Code

例如: -

enter image description here

然后结果应该像

  • 1 PT01 null
  • 2 PT01 CH01

到现在为止,我的查询是

select MT.ID, PT.code, CH.code from Maintable MT
left outer join Parent PT on MT.SatgeId = PT.ID and MT.ConfigTable = 'Parent'
left outer join child CH on MT.SatgeId = CH.ID and MT.ConfigTable = 'Child'

我正在获得像

这样的输出
  • 1 PT01 null
  • 2 null CH01

1 个答案:

答案 0 :(得分:0)

您需要使用映射表以便按子选择父级。以下是如何执行此操作:

DECLARE @mt TABLE(ID INT, StageID INT, ConfigTable VARCHAR(10))
DECLARE @pt TABLE(ID INT, Code VARCHAR(10))
DECLARE @ct TABLE(ID INT, Code VARCHAR(10))
DECLARE @map TABLE(ID INT, ParentID INT, ChildID INT)

INSERT INTO @mt VALUES(1, 1, 'Parent'),(2, 1, 'Child')
INSERT INTO @pt VALUES(1, 'PT01')
INSERT INTO @ct VALUES(1, 'CH01')
INSERT INTO @map VALUES(1, 1, 1)

SELECT mt.ID, 
       ISNULL(pt.Code, ptp.Code) AS PCode, 
       ct.Code AS CCode
FROM @mt mt
LEFT JOIN @pt pt ON mt.ConfigTable = 'Parent' AND mt.StageID = pt.ID
LEFT JOIN @ct ct ON mt.ConfigTable = 'Child' AND mt.StageID = ct.ID
LEFT JOIN @map map ON ct.ID = map.ChildID
LEFT JOIN @pt ptp ON map.ParentID = ptp.ID

输出:

ID  PCode   CCode
1   PT01    NULL
2   PT01    CH01