用两个结果连接表格

时间:2013-08-05 16:21:32

标签: sql

我有两个表,t1和t2。 t1持有合约号码,而t2持有这些合约的合约事件。

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

我试过了:

  • left join
  • 内部联接和
  • 左外连接

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

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]

2 个答案:

答案 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