【问题标题】:Join two tables with two columns SQL Server 2008 R2用两列连接两个表 SQL Server 2008 R2
【发布时间】:2014-05-11 04:47:36
【问题描述】:

我有两张表要合并在一起。一个是包含各种信息位的表,一个是维度视图,一个定义表。包含所需信息的表格如下所示

VISIT ID | ATN_DR_NO | ADM_DR_NO |...
12345678 | 987654    | 123456    |...

其中 ATN_DR_NO 是主治医生 ID 号,ADM_DR_NO 是入院医生 ID。我有第二张表,其中包含医生 ID 号及其相应的名称,如下所示

src_prct_no | pract_rpt_name | ...
987654      | Dr. A          | ...
123456      | Dr. B          | ...
...

我想要完成的是在我有以下内容的表中获得结果

VISIT ID | ATN_DR_NO | ATN DR NAME | ADM_DR_NO | ADM DR NAME
12345678 | 987654    | DR. A       | 123456    | DR. B

我不知道如何加入多个列。

这是我正在处理的整个查询:

SET ANSI_NULLS OFF
GO
-- VARIABLE DECLARATION AND INITIALIZATION
DECLARE @SD DATETIME;
DECLARE @ED DATETIME;
SET @SD = '2014-01-01';
SET @ED = '2014-02-01';

/*
-----------------------------------------------------------------------
THIS QUERY WILL GET ALL THE FRONT END INFORMATION REQUIRED FOR HOSIM
AND INSERT IT INTO A TABLE THAT WILL GET MATCHED UP WITH THE DISCHARGE
ORDERS TABLE
-----------------------------------------------------------------------
START OF QUERY 1
-----------------------------------------------------------------------
*/
-- TABLE DECLARATION
DECLARE @T1 TABLE (
    [ENCOUNTER ID]               VARCHAR(200)
    , /*NEW*/MRN                 VARCHAR(20)    
    , /*NEW*/DOB                 DATETIME
    , /*NEW*/GENDER              VARCHAR(10)
    , FINANCIALCLASSORIG         VARCHAR(200)
    , [ADMIT DATE]               DATE
    , [ADMIT TIME]               TIME
    , [ADMIT FROM]               VARCHAR(200)
    , [DISCHARGE DATE]           DATE
    , [DISCHARGE TIME]           TIME
    , /*TEST*/[ADMITTING MD NO]  VARCHAR(200)
    , /*TEST*/[ADMITTING MD]     VARCHAR(200)
    , /*TEST*/[ATTENDING MD NO]  VARCHAR(200)
    , /*TEST*/[ADTTENDING MD]    VARCHAR(200)
    , [MS DRG]                   VARCHAR(200)
    , LOS                        VARCHAR(20)
    , [ADMIT PATIENT STATUS]     VARCHAR (10)
    , [DISCHARGE PATIENT STATUS] VARCHAR(10)
    , [DISCHARGE DISPOSITION]    VARCHAR (200)
    , [DISCHARGE UNIT]           VARCHAR (200)
)
-- WHAT GETS INSERTED INTO @T1
INSERT INTO @T1
SELECT
A.[VISIT ID]
, A.MRN
, A.DOB
, A.GENDER
, A.FINANCIALCLASSORIG
, A.[ADMIT DATE]
, A.[ADMIT TIME]
, A.[ADMIT FROM]
, A.[DISCHARGE DATE]
, A.[DISCHARGE TIME]
, A.[ADMITTING DR NO]
, A.[ADMITTING DR]
, A.[ATTENDING DR NO]
, A.[ATTENDING DR]
, A.[MS DRG]
, A.LOS
, A.[ADMIT PATIENT STATUS]
, A.[DISCHARGE PATIENT STATUS]
, A.[DISCHARGE DISPOSITION]
, A.[DISCHARGE UNIT]
-- END @T1 INSERT SELECTION

-- WHERE IT ALL COMES FROM
-- COLUMN SELECTION
FROM (
    SELECT DISTINCT PAV.PtNo_Num        AS [VISIT ID]
    , /*NEW*/PAV.Med_Rec_No             AS MRN
    , /*NEW*/PAV.Pt_Birthdate           AS DOB
    , /*NEW*/PAV.Pt_Sex                 AS GENDER
    , PD.pyr_name                       AS [FinancialClassOrig]
    , CAST(PAV.Adm_Date AS DATE)        AS [ADMIT DATE]
    , CAST(PAV.vst_start_dtime AS TIME) AS [ADMIT TIME]
    , PAV.Adm_Source                    AS [ADMIT FROM]
    , CAST(PAV.Dsch_Date AS DATE)       AS [DISCHARGE DATE]
    , CAST(PAV.Dsch_DTime AS TIME)      AS [DISCHARGE TIME]
    , /*TEST*/PAV.Adm_Dr_No             AS [ADMITTING DR NO]
    , /*TEST*/PDV.pract_rpt_name        AS [ADMITTING DR]
    , /*TEST*/PAV.Atn_Dr_No             AS [ATTENDING DR NO]
    , /*TEST*/PDV.pract_rpt_name        AS [ATTENDING DR]
    , PAV.drg_no                        AS [MS DRG]
    , PAV.Days_Stay                     AS [LOS]
    , 'I'                               AS [ADMIT PATIENT STATUS]
    , 'I'                               AS [DISCHARGE PATIENT STATUS]
    , DDM.dsch_disp_desc                AS [DISCHARGE DISPOSITION]
    , VR.ward_cd                        AS [DISCHARGE UNIT]

    -- FROM DB(S)
    FROM smsdss.BMH_PLM_PtAcct_V PAV
         JOIN smsdss.pract_dim_v PDV
         ON PAV.Adm_Dr_No = PDV.src_pract_no
         /*TEST*/AND PAV.Atn_Dr_No = PDV.src_pract_no
         JOIN smsdss.pyr_dim PD
         ON PAV.Pyr1_Co_Plan_Cd = PD.pyr_cd
         JOIN smsmir.vst_rpt VR
         ON PAV.PtNo_Num = VR.acct_no
         JOIN smsdss.dsch_disp_mstr DDM
         ON VR.dsch_disp = DDM.dsch_disp

    -- FILTER(S)
    WHERE PAV.Dsch_Date >= @SD 
    AND PAV.Dsch_Date < @ED
    AND PAV.Plm_Pt_Acct_Type = 'I'
    AND PAV.PtNo_Num < '20000000'
    AND PDV.src_spclty_cd = 'HOSIM'
    AND PD.orgz_cd = 'S0X0'
    AND PD.pyr_name != '?'
) A

SELECT * FROM @T1

你认为我应该只创建像@ADM_DR@ATN_DR 这样的变量,并在WHERE 子句中将它们设置为等于可以获得它们的select 语句吗? 谢谢,

【问题讨论】:

    标签: sql sql-server-2008 join sql-server-2008-r2


    【解决方案1】:

    您再次加入表中,因此看起来好像您从同一张表中两次(一次用于主治医生查找,一次用于入院医生查找)。

    SELECT a.doc_name as attending_name, 
           b.somefield, 
           a2.doc_name as admitting_name
    
    FROM doctors a, 
         someothertable b, 
         doctors a2
    
    WHERE a.doc_id = b.attending_doc_id
      AND a2.doc_id = b.admitting_doc_id
      AND b.record_id = <whatever>
    

    你的 a 内部连接针对第一个医生,a2 的连接针对第二个医生。

    请原谅伪代码,但我想你明白了。您会注意到 a 和 a2 都从医生表中获取 doc_name 字段,但它们连接到 b 表中的不同 ID。

    【讨论】:

    • 谢谢 Jason,我打算这样做,我想用更复杂的方式制作一个变量,我很高兴我没有这样做。
    • 我对伪代码进行了更多修改,以便于阅读。很高兴我能帮上忙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多