2016-01-13 91 views
0

我是新来的sql所以让我道歉,我开始之前之间。查找匹配或不匹配的两个表

我试图国旗我会拨打以下方式保单号码相匹配。

Select c.last_name, c.first_name, c.sex, c.date_of_birth, c.record_nbr, 
case when ph.policy_nbr = cp.policy_nbr then ph.policy_nbr else 'No Match' 

From table ph 

Left join client c 
On ph.last_name = c.last_name 
And ph.first_name = c.first_name 
And ph.date_of_birth = c.date_of_birth 
And ph.sex = c.sex 
Left join person_payer cp 
On c.person_id = cp.person_id 

Group by c.last_name, c.first_name,c.date_of_birth, 
c.sex,ph.policy_num, cp.policy_nbr 

这个想法是根据姓氏,名字,dob和性别找到匹配表。然后我想验证一个保单号上的匹配或不匹配。患者记录中是否存在保单编号?不幸的是,由于客户记录中存在多个保单编号,因此这会产生匹配并且不匹配。我如何才能在报告列表中列出客户一次且仅列出“不匹配”或匹配保单编号。

+1

样本数据和预期的结果将澄清你正在尝试做的。 –

+0

你是否遗漏了一个连接,因为没有连接到表别名pp。而ph是表名“table”的别名吧? –

+0

所以我想向客户展示在姓氏,名字,dob和性别上找到完全匹配的地方。然后报告在客户的person_payer表上是否找到匹配的保单号码。问题是person_payer表拥有多个保单号码。我需要它只显示一次匹配或找不到匹配。我会进一步补充,现在开车回家。 –

回答

0

假设策略表的名字是PolicyTable(因为它的命名表,但SQL Server的抱怨吧),你可以做选择的单柱,而不是加入。

Select c.last_name, c.first_name, c.sex, c.date_of_birth, c.record_nbr, 
ISNULL((Select top 1 ph.policy_nbr from PolicyTable ph where ph.last_name = c.last_name 
And ph.first_name = c.first_name 
And ph.date_of_birth = c.date_of_birth 
And ph.sex = c.sex 
And cp.policy_nbr = ph.policy_nbr), 'No Match') as PolicyNumber 

From client c 
Left join person_payer cp On c.person_id = cp.person_id 
+0

不幸的是,这会产生结果,但查询从不停止运行。 –

0
Select c.last_name, c.first_name, c.sex, c.date_of_birth, c.record_nbr, 
isnull(cp.policy_nbr, 'No Match') 

From table ph 

Left join client c 
On ph.last_name = c.last_name 
And ph.first_name = c.first_name 
And ph.date_of_birth = c.date_of_birth 
And ph.sex = c.sex 
Left join person_payer cp 
On c.person_id = cp.person_id 
and ph.policy_nbr = cp.policy_nbr 

Group by c.last_name, c.first_name,c.date_of_birth, 
c.sex,ph.policy_num, cp.policy_nbr 
+0

谢谢,但是我已经注意到这会产生结果,但所有列中都有很多空值。 –