我有两个表,t1和t2。 t1持有合约号码,而t2持有这些合约的合约事件。
我正在尝试从t1中选择所有合同以及t2中与t1匹配的所有记录,但也尝试从t1返回所有与t2不匹配的记录。 我的查询似乎只是带回了与两个表匹配的所有记录。
我试过了:
然而我仍然得到相同的结果。
t1持有293个结果,t2持有270个事件。一些t2事件有1个contractid的多个事件,而有些帐户没有注册事件。
我想要恢复所有contractID
以及与contractID
相关联的所有事件,但我还想返回没有事件的合同,在contractID
列中为null
我当前的查询:
SELECT p.contractfk
,[GetEnddate](p.ContractFK) [Contract End Date] -- function
,CASE
WHEN c.StartDate IS NULL THEN 1
WHEN c.StartDate > ce.CreatedDate THEN 1
ELSE 0
END [PreEngineer]
,CASE
WHEN c.StartDate < ce.CreatedDate THEN 1 ELSE 0
END [PostEngineer]
FROM [CRM].[pbx].[PBX] p
LEFT JOIN [ContractEnquiry] ce
ON ce.ContractFK = p.ContractFK
LEFT JOIN [Contract] c
ON [c].[contractID] = [P].[contractfk]
答案 0 :(得分:1)
您的查询是基本的左外连接:
select t1.*, t2.*
from t1 left outer join
t2
on t1.contractId = t2.ContractId;
如果您希望获得一份合同,请务必选择t1
而不是t2
:
select t1.*, t2.*
from t1 left outer join
t2
on t1.contractId = t2.ContractId
where t1.contractId = MYCONTRACTID;
如果您从t2
中选择,则会将left outer join
转回inner join
。
答案 1 :(得分:1)
看起来您的表格顺序混合了很多,如果要返回它,则必须选择ContractID。您可以在查询中重新排序表格:
SELECT DISTINCT c.contractID
,[GetEnddate](p.ContractFK) [Contract End Date] -- function
,CASE
WHEN c.StartDate IS NULL THEN 1
WHEN c.StartDate > ce.CreatedDate THEN 1
ELSE 0
END [PreEngineer]
,CASE
WHEN c.StartDate < ce.CreatedDate THEN 1 ELSE 0
END [PostEngineer]
FROM [Contract] c
LEFT JOIN [CRM].[pbx].[PBX] p
ON c.[contractID] = p.[contractfk]
LEFT JOIN [ContractEnquiry] ce
ON ce.ContractFK = p.ContractFK