【问题标题】:SQL query help needed to include non matching records需要包含不匹配记录的 SQL 查询帮助
【发布时间】:2013-02-15 16:24:00
【问题描述】:

我需要显示一个查询,该查询显示与主查找表匹配和不匹配的行

@PostCodes 表包含第二个查询将与之匹配的主表的邮政编码

DECLARE @PostCodes TABLE 
(
    RowID int not null primary key identity(1,1), 
    Postcodes varchar(100) 
) 


SELECT 
   C.CampaignId, C.Name, C.Description,C.EndedOn, C.Active, C.Manager, 
   P.PostcodeArea, P.PostcodeDistrict
FROM 
   Campaign C, CampaignPostcode P, @PostCodes pc
WHERE 
   P.CampaignId = C.CampaignId AND
   P.PostcodeDistrict = pc.Postcodes AND
   C.EndedOn IS NULL 

第二个查询只返回与邮政编码匹配的记录,我已经尝试了所有方法来包含不匹配的记录,但没有运气。

有什么帮助吗?


编辑(表格)

 PostCodes  (table1)             Campaign (table2)                      

Id      Postcodes          CampaignId    Name      Desc           
1        AA                  1            camp1    Desc1
2        AB                  2            camp2    Desc2 
3        AC                  3            camp3    Desc3
4        AD                  4            camp4    Desc4

CampaignPostcode (table3)

CampaignPostcodeId  CampaignId  PostcodeArea
 1                      1          AA
 2                      2          AB
 3                      2          AB
 4                      3          AC

需要输出

   Id  CampaignName   Desc   PostcodeIn PostcodeOut
    1    Camp1        Desc1     AA          NULL
    2    Camp2        Desc2     AB          NULL
    3    Camp2        Desc2     AB          NULL
    4    Camp3        Desc3     AC          NULL
    5    Camp4        Desc4     NULL        AD

【问题讨论】:

  • Bad habits to kick : using old-style JOINs - ANSI-92 SQL 标准 ( 20 年前!)。 停止使用!如果您使用 proper ANSI JOIN 语法,它将是 LEFT OUTER JOIN 而不是 INNER JOIN - 很简单 ...
  • @PostCodes pcCampaign C 这两个表是如何相互关联的?通过哪个键?
  • @MahmoudGamal: Postcodes 和 Campaign 不相关,它的campaign.campaignid =campaignpostcode.campaignid 和campaignpostcode.postcodedistrict = Postcodes.postcodes 希望这可以消除你的疑惑

标签: sql


【解决方案1】:

这个呢:

SELECT 
   C.CampaignId, C.Name, C.Description,C.EndedOn, C.Active, C.Manager, 
   P.PostcodeArea, P.PostcodeDistrict
FROM 
   Campaign C
INNER JOIN
   CampaignPostcode P ON P.CampaignId = C.CampaignId
LEFT OUTER JOIN
   @PostCodes pc ON P.PostcodeDistrict = pc.Postcodes 
WHERE 
   C.EndedOn IS NULL 

【讨论】:

  • 它不工作。仅供参考,C.EndedOn 是查询的一部分,并不打算返回不匹配的行。所以请把它作为查询的一部分。
  • @DotNetGeek:您的问题非常模糊,关于表的关联方式,以及您想要显示的“不匹配”行在哪个表中 - 但此查询应该让您了解如何去做吧!使用包含所有行的表,然后使用 LEFT OUTER JOIN 连接可能有行或没有行的表
  • 我已经编辑了这篇文章,以便更清楚地了解我需要什么。谢谢
【解决方案2】:

试试这个:

SELECT   
  p.*
FROM @PostCodes AS PC
LEFT JOIN
(
  SELECT *
  FROM Campaign C
  INNER JOIN CampaignPostcode P ON  P.CampaignId = C.CampaignId
) AS p ON P.PostcodeDistrict = pc.Postcodes
WHERE P.EndedOn IS NULL 

【讨论】:

  • 感谢@Mahmoud,我会试试这个。仅供参考,我已经编辑了这篇文章,以便更清楚地说明我需要什么。
  • @DotNetGeek - 你能解释一下这背后的逻辑吗?特别是第五行,我可以得到前4行,然后你需要使用UNION来获得第五行,但我不明白它背后的想法。 Here is the first four rows
  • 我想构建一个结果,其中包含参与活动的行以及未参与的行,然后我想将结果绑定到网格。希望有帮助。另外,我已经有了包含的 4 行的结果。
  • @DotNetGeek 您可以轻松获得所有 5 个 compigns,但问题是两列 PostcodeInPostcodeOut 如何从三个表中为每个 compiagn 计算它们,这是我不知道的不明白。我可以轻松获取所有行,但问题出在PostcodeOut
  • 这只是虚构的,你可以使用任何你喜欢的东西,这只是我的想法。顺便说一句,感谢您的快速回复。
猜你喜欢
  • 2015-05-02
  • 2011-04-03
  • 1970-01-01
  • 2016-07-04
  • 2016-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-18
相关资源
最近更新 更多