2015-09-21 52 views
0

我有3个表ClientVisit,Location和连接表ClientVisitLocation 连接表包含访问位置的历史记录。sql连接父记录

3个表的基本连接可以返回父记录或子记录。 如果记录是父级别,则位置表有一个[parentGuid]列,那么this = 0,否则它是父级位置的guid。

要将它放到上下文中,存储在clientVisitLocation表中的locationID可引用病房或病床。我想我的查询返回病房

我已经第二次加入位置表,但是这给了我空列l2,其中我已经包含了病房级别。我想让病房级别的位置出现在同一列中。

Select cvl.*, l2.* from 
cv3clientvisit cv 
inner join CV3ClientVisitLocation cvl on cv.guid = cvl.clientvisitguid 
inner join cv3Location l on CVl.locationguid = l.guid 
left join cv3location l2 on l.locngrpguid = l2.guid 

回报

-+ 
| visitid | Locn1ID | Locn1Name | Locn1parent | locn2ID | Locn2Name | Locn2Parent | | 
+---------+---------+---------------+-------------+---------+-----------+-------------+--+ 
|  1 |  1 | ward F - bed2 |  1234 | 1234 | WardF  | NULL  | | 
|  1 |  2 | ward F - bed4 |  1234 | 1234 | WardF  | NULL  | | 
|  1 |  3 | Ward B  |   0 | NULL | NULL  | NULL  | | 
+---------+---------+---------------+-------------+---------+-----------+-------------+--+ 

我希望它返回

+---------+---------+----------+ 
| visitid | Locn1ID | LocnName | 
+---------+---------+----------+ 
|  1 |  1 | Ward F | 
|  1 |  2 | Ward F | 
|  1 |  3 | Ward B | 
+---------+---------+----------+ 

我可以在选择部分使用COALESCE,但因为这是在一个较大的查询难道不联接部分给我想要的结果。 我敢肯定,它相当简单,但我现在已经有了一个思维模块。

+0

你起诉的Allscripts SunriseXA?位置表具有不齐整的层次结构。你可能不得不比目前的更多一点 –

+0

我确实,我使用的parentguid列实际上是LocnGrpGuid列,但对于不知道数据库的人来说它是相同的东西,实际的parentguid可以引用一个海湾。那么我将不得不第三次加入地点表。 – pancho018

+0

你如何区分病房和病床?有没有一个有你想要的价值的领域? – Beth

回答

1

试试这个:

SELECT 
    A.visitid, 
    A.Locn1ID, 
    CASE 
     WHEN A.Locn2Name is null THEN A.Locn1Name 
     ELSE A.Locn2Name 
    END 
    FROM (Select cvl.*, l2.* from 
cv3clientvisit cv 
inner join CV3ClientVisitLocation cvl on cv.guid = cvl.clientvisitguid 
inner join cv3Location l on CVl.locationguid = l.guid 
left join cv3location l2 on l.locngrpguid = l2.guid) as A 
+0

现在这么明显!我正在尝试在WHERE子句中使用CASE WHEN。 – pancho018

1

有关Sunrise的真正快速注意事项是位置层次结构不齐。一个病房和一张床可能在树上有不同的距离,特别是在两个不同的校园之间。此外,一些地点不使用病房,有的使用单位,有的使用诊所等。

这可能有点矫枉过正,你需要什么,我创建了一个表函数来查找一些关于位置的附加信息。您可以使用下面的功能并加入您正在查找的类型代码。

CREATE FUNCTION [dbo].[XXX_WhereAmI](@Location Numeric(16,0)) 
RETURNS @locationDetails Table(
GUID Numeric(16,0), 
TypeCode Varchar(50), 
Name Varchar(255), 
ParentGUID Numeric(16,0), 
FacilityGUID Numeric(16,0) 
) 
AS 
BEGIN 

DECLARE @Facility as Numeric(16,0) 
DECLARE @TypeCode as Varchar(30); 
DECLARE @Facilities as TABLE(FacilityGUID Numeric(16,0)) 

INSERT INTO @Facilities 
SELECT DISTINCT FacilityGUID 
FROM [$(XAProd)]..CV3Location 

SET @Facility = (SELECT FacilityGUID FROM [$(XAProd)]..CV3Location WHERE GUID = @Location) 
--SELECT @FLocale 
WHILE @Location NOT IN (SELECT FacilityGUID FROM @Facilities) 
BEGIN 
    INSERT INTO @locationDetails (GUID, TypeCode, Name, ParentGUID, FacilityGUID) 
    SELECT GUID, 
      TypeCode, 
      Name, 
      ParentGUID, 
      FacilityGUID 
     FROM [$(XAProd)]..CV3Location WHERE GUID = @Location 

    SET @Location = (SELECT ParentGUID FROM [$(XAProd)]..CV3Location WHERE GUID = @Location) 
END 


INSERT INTO @locationDetails (GUID, TypeCode, Name, ParentGUID, FacilityGUID) 
SELECT GUID, 
    'Facility', 
    Name, 
    ParentGUID, 
    FacilityGUID 
FROM [$(XAProd)]..CV3Location WHERE GUID = @Facility 

RETURN 
END; 
+0

我认为这是轻微的矫枉过正,因为我想在这里做什么,但将是v.useful别的东西。那谢谢啦。 – pancho018