进行外连接时未收到所有预期数据

问题描述 投票:0回答:1

我提前道歉,我相信每个人都厌倦了加入问题。这让我感觉很愚蠢,因为它确实强调了我显然不理解我应该理解的连接方式。

快速总结是,我正在尝试获取所有医院的 3 列结果(医院名称、保留类型、保留数量),并且我希望每家医院始终显示 3 个指标中的每一个指标我正在寻找,即使他们没有记录。

我想看到的是:

但是我得到的是:

我确信有一种比我正在做的方式(即临时表)更好的方法,但这是另一天的问题 =)。 临时表仅保存 3 条记录,您可以在 case 语句中看到保存的名称。

我尝试过各种版本的连接,但无法放弃正确的做法。这是我认为可以解决问题的方法。

CREATE TABLE #interventions (
  intervention      varchar(100)
)

-- Populate #interventions.
INSERT INTO #interventions SELECT DISTINCT intervention FROM tblHolds WHERE intervention NOT LIKE '%@%' AND intervention <> 'Physical Hold'

-- Final query.
SELECT hosp_name AS hospital, a.intervention, COUNT(b.intervention) AS intervention_cnt
FROM #interventions a 
  LEFT JOIN tblHolds b ON a.intervention = b.intervention
  INNER JOIN tblHospitalList c ON b.hosp_id = c.hosp_id
GROUP BY hosp_name, a.intervention
ORDER BY hosp_name,
  CASE
    when a.intervention = 'Physical Restraint' THEN 1
    when a.intervention = 'Seclusion' THEN 2
    when a.intervention = 'Mechanical Restraint' THEN 3
    ELSE 9
END


DROP TABLE #interventions
sql database join
1个回答
0
投票

这可以通过使用交叉连接来解决,以获得医院和干预的每种组合。

CREATE TABLE #interventions (
  intervention      varchar(100)
)

-- Populate #interventions.
INSERT INTO #interventions (intervention) VALUES
('Physical Restraint'  ),  
('Seclusion'),
  ('Mechanical Restraint');

SELECT * FROM #interventions
  
--  SELECT DISTINCT intervention FROM tblHolds WHERE intervention NOT LIKE '%@%' AND intervention <> 'Physical Hold'


CREATE TABLE tblHolds (
  intervention      varchar(100),
  hosp_id varchar(100)
)

INSERT INTO tblHolds (intervention,hosp_id) VALUES
('Physical Restraint','1'  ),  
('Seclusion','2'),
  ('Mechanical Restraint','2');

CREATE TABLE tblHospitalList (
  hosp_name      varchar(100),
  hosp_id varchar(100)
)

INSERT INTO tblHospitalList (hosp_name,hosp_id) VALUES
('First Hospital','1'),  
('Second Hospital','2');

  
-- Final query.
SELECT hosp_name AS hospital, a.intervention, COUNT(b.intervention) AS intervention_cnt
FROM #interventions a 
  CROSS JOIN tblHospitalList c
  LEFT JOIN tblHolds b ON a.intervention = b.intervention AND  b.hosp_id = c.hosp_id
GROUP BY hosp_name, a.intervention
ORDER BY hosp_name,
  CASE
    when a.intervention = 'Physical Restraint' THEN 1
    when a.intervention = 'Seclusion' THEN 2
    when a.intervention = 'Mechanical Restraint' THEN 3
    ELSE 9
END


DROP TABLE #interventions

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.