【发布时间】:2014-06-15 01:57:09
【问题描述】:
我遇到了一个不知道如何解决的小问题 - 我以前从未遇到过。我正在使用 MS SQL 并有一个 SQL JOIN 查询来查询两个表——保险和债权人。保险表包含所有保单详细信息,而债权人表包含公司详细信息(保险公司/经纪人名称等)。
Insurance 表包含两个名为 CreditorID 和 BrokerID 的外键。这两个外键都与同一个字段相关,即 Creditor 表中的 CreditorID 字段(因为一些债权人既是保险公司又是保险经纪人)。我不确定的是如何编写查询。
例如Insurance 表可能如下所示:
lInsuranceID lCreditorID lBrokerID mLastPremium dDatePaid sPolicyNumber
1 1 null 1000.00 28/03/2014 12345
2 14 1 2000.00 17/03/2014 67891
Creditor 表可能如下所示:
lCreditorID sCreditorName
1 Frank's Insurance COMPANY
14 Frank's Insurance BROKER
所以问题是,当我检索特定财产的信息时,我需要从 Creditor 表中提取信息两次 - 一次使用 Insurance.CreditorID = Creditor.CreditorID,再次使用 Insurance.CreditorID = Creditor.BrokerID。
但我不知道如何在一次加入中做到这一点。我试过了,但没有用(我收到一条错误消息,提示“Creditor.sCreditorName”无法绑定:
SELECT Insurance.sPolicyNumber,
Insurance.dDatePaid,
Insurance.dRenewal,
Insurance.mLastPremium,
Creditor.sCreditorName
FROM Insurance
INNER JOIN Creditor cred ON Insurance.lCreditorID = cred.lCreditorID
INNER JOIN Creditor cred1 ON Insurance.lBrokerID = cred1.lCreditorID
WHERE Insurance.lOwnersCorporationID = '1'
有什么建议吗?
编辑 好的,谢谢所有的提示,偷看。我修改了查询,使其看起来像这样,它似乎正在工作(我是一个这样的 JOIN 菜鸟。即使它有效,我也不知道为什么)
SELECT Insurance.sPolicyNumber, Insurance.dDatePaid, Insurance.dRenewal, Insurance.mLastPremium, cred.sCreditorName as Company, cred1.sCreditorName as Broker
FROM Insurance
LEFT JOIN Creditor cred ON Insurance.lCreditorID = cred.lCreditorID
LEFT JOIN Creditor cred1 ON Insurance.lBrokerID = cred1.lCreditorID
WHERE Insurance.lOwnersCorporationID = '1'
【问题讨论】:
-
哦,澄清一下,我需要查询这两个字段的原因是,有时财产是由“Fred's Insurance Company”投保的,但实际上是由“Dude's Brokerage Firm”代理的。所以我需要这两个字段来确保所有信息都在那里。而且,我没有设计这个数据库,也不能修改设计一个 iota,因为其他系统依赖于它的结构。
-
Creditor.sCreditorName不能绑定的原因是因为你没有使用 Creditor 作为别名 - 你有 cred 和cred1所以 SQL 不知道它属于哪个表(即使它是同一张表)。
标签: sql sql-server join