0

我有两张桌子,t1 和 t2。t1 保存合约编号,而 t2 保存这些合约的合约事件。

我正在尝试从 t1 中选择所有合同以及从 t2 中选择与 t1 匹配的所有记录,但也尝试从 t1 中返回与 t2 不匹配的所有记录。我的查询似乎只是带回了与两个表匹配的所有记录。

我努力了:

  • 左连接
  • 内连接和
  • 左外连接

但我仍然得到相同的结果。

t1 包含 293 个结果,t2 包含 270 个事件。一些 t2 事件对 1 个合约 ID 有多个事件,而一些帐户没有针对它们注册的事件。

我想带回所有contractIDs 和与之相关的所有事件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]
4

2 回答 2

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 
于 2013-08-05T16:40:00.727 回答
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.

于 2013-08-05T16:25:51.803 回答