Sql 如何使用subselect执行查询

Sql 如何使用subselect执行查询,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我在我的查询中遇到了一个问题,我认为这可以通过一个子选择来解决 我有一个名为San_Proposta的表,该表的主键名为Proposta_Id。在该表中,San_Proposta有一些列,但有一个特定列名为StatusProposta_Id。StatusProposta_Id只能有2个值:1或2。如果SanProposta_Id为1,则Proposta_Id不存在于名为San_Negocio的表中,该表具有名为Proposta_Id的外键。如果StatusProposta_Id为2,则Propo

我在我的查询中遇到了一个问题,我认为这可以通过一个子选择来解决

我有一个名为San_Proposta的表,该表的主键名为Proposta_Id。在该表中,San_Proposta有一些列,但有一个特定列名为StatusProposta_Id。StatusProposta_Id只能有2个值:1或2。如果SanProposta_Id为1,则Proposta_Id不存在于名为San_Negocio的表中,该表具有名为Proposta_Id的外键。如果StatusProposta_Id为2,则Proposta_Id存在于名为San_Negocio的表中

在San_Negocio,我有一些专栏,但让我们特别关注两个专栏:ValidaVenda和ValidaCaptacao。两列只能有2个值:1或0

我只想做一个查询

返回San_Negocio中不存在的所有数据,以及如何提前告知,如果San_Proposta.Proposta_Id为1,则San_Negocio中不存在, 返回在San_Proposta中存在但在San_Negocio中不存在的所有数据,以及如果San_Proposta.Proposta_Id为2,则在San_Negocio中如何提前告知 如果San_Proposta.Proposta_Id存在于我的San_Negocio表中,to Proposta_Id存在于我的San_Negocio表中,则San_Proposta.StatusProposta_Id的值为2,则我名为San_Negocio.ValidaVenda的列不能与San_Negocio.ValidaCaptaco的值相同。 我该怎么做

我尝试了以下查询,但无法正常工作

select 
   San_Proposta.Proposta_Id 
from 
   San_Proposta
left outer join 
     (
         select 
           * 
         from 
           San_Negocio 
         where 
           Proposta_Id is not null 
           and ValidaCaptacao <> ValidaVenda
     ) AS Negocio2
      on San_Proposta.Proposta_Id = Negocio2.Proposta_Id
where 
  San_Proposta.StatusProposta_Id IN (1,2)
圣内戈西奥

@更新

我所期望的


我希望查询返回Proposta_Id 1,2,3,因为它们在San_Negocio中不存在,Proposta_Id 4,5,因为它们在San_Negocio中存在,但ValidaVenda与ValidaCaptacao不同。

我试图了解您关于内容和关系的想法,但这很难。所以我建议你重新考虑你的问题

编辑:好的。谢谢你的更新

我将使用以下语句

SELECT san_proposta.proposta_id FROM   san_proposta WHERE  statusproposta_id = 1
UNION ALL
SELECT san_proposta.proposta_id FROM   san_proposta
       JOIN san_negocio ON san_proposta.proposta_id = san_negocio.proposta_id
                       AND san_negocio.validacaptacao <> san_negocio.validavenda  

显然,你在英语翻译上尽了最大努力来帮助你的问题得到答案。我理解查询的元素,但不知道为什么/您特别想要获取或排除什么。此外,为什么在一个查询中所有查询都包含。我提供的是一个查询,以获取所有元素(如果它们存在或不存在),并且刚刚添加了一些标志列,您可以稍后使用或不限制它们

简言之,从San_Proposta到公共ID上的San_Negocio的左连接基本上不需要使用标志列1或2来标识另一个记录中是否存在记录。如果找到匹配项,无论文件中是否存在错误的标志设置,都非常好。从那里,您可以在其他列上检测相同或不同状态代码的IF限定符

select 
      SP.*,
      CASE WHEN SN.Proposta_ID IS NULL THEN "No" ELSE "Yes" END as FoundInSanNegocio       
   from 
      San_Proposta SP
         LEFT JOIN San_Negocio SN
            ON SP.Proposta_ID = SN.Proposta_ID
   WHERE
         SN.Proposta_ID IS NULL
      OR NOT SN.ValidaCaptacao = SN.ValidaVenda
having子句将明确排除San_Negocio中的代码,且代码值相同

现在,您可以扫描所有记录,并通过标志列将所有状态放在一个位置

是否再次找到,与标志列无关。如果它有密钥,则在左侧连接处找到它


如果未找到,则HassameValidCode列将设置为不适用,否则将设置为相同或不同。

什么不起作用?您是否得到错误或不正确的结果?最好提供一些说明数据和预期结果,以便所有人都能快速查找并帮助您。@ThitLwinOo I Update my postIt返回以下错误:不明确的列名“Proposta_Id”。仅供参考。当您将AND子句添加到where(如此处所示)时,它直接导致左连接成为内部连接,因为现在需要限定。要使其保持左连接,需要将条件保留在JOIN/ON子句中。@DRapp,是的,您是对的。在这个查询中,左边实际上不是必需的。因此,它可以在没有左边的情况下使用吗?它返回以下错误:无效的列名“HassameValidCode”。@Lucas_Santos,对不起,更习惯MySQL而不是SQLServer。我已经修改了对logical OR in WHERE子句的查询,以允许NULL,即:在表中找不到匹配项,或者找到了匹配项且列彼此不相等。
Proposta_Id
1
2
3
4
5
SELECT san_proposta.proposta_id FROM   san_proposta WHERE  statusproposta_id = 1
UNION ALL
SELECT san_proposta.proposta_id FROM   san_proposta
       JOIN san_negocio ON san_proposta.proposta_id = san_negocio.proposta_id
                       AND san_negocio.validacaptacao <> san_negocio.validavenda  
select p.* from San_Proposta p 
where p.StatusProposta_Id = 1

union 

select p.* from San_Proposta p 
    left join San_Negocio n on n.Proposta_Id = p.Proposta_Id
where p.StatusProposta_Id = 2
    and n.ValidaCaptacao <> n.ValidaVenda
select 
      SP.*,
      CASE WHEN SN.Proposta_ID IS NULL THEN "No" ELSE "Yes" END as FoundInSanNegocio       
   from 
      San_Proposta SP
         LEFT JOIN San_Negocio SN
            ON SP.Proposta_ID = SN.Proposta_ID
   WHERE
         SN.Proposta_ID IS NULL
      OR NOT SN.ValidaCaptacao = SN.ValidaVenda