如何使用subselect进行查询

时间:2012-03-01 13:16:28

标签: 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,则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_Negocio上存在San_Proposta.Proposta_Id,(对于我的San_Negocio表中的Proposta_Id,San_Proposta.StatusProposta_Id的值为2),我的名为San_Negocio.ValidaVenda的列不能具有相同的San_Negocio.ValidaCaptacao值

我该怎么做?

我尝试了以下查询,但无法正常使用

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)

@Updated

San_Proposta

Proposta_Id  |  StatusProposta_Id
1               1
2               1
3               1
4               2
5               2
6               2

San_Negocio

Proposta_Id  |  ValidaVenda  | ValidaCaptacao
4               1              0
5               0              1
6               1              1

@Updated

我的期望

Proposta_Id
1
2
3
4
5

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我试图跟随你对内容和关系的看法,但这很难。所以我建议你重新考虑一下你的问题。

编辑:好的。感谢您的更新。

我会使用以下声明。

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  

答案 2 :(得分:0)

显然,您在英语翻译方面做得最好,以帮助您解答问题。我了解查询的元素,但不知道您为什么/特别想要获取或排除的内容。另外,为什么所有人都在一个查询中。我提供的是一个查询,以获取所有元素,如果它们存在与否,并刚刚添加了一些&#34; flag&#34;您可以使用或不使用以后限制的列。

简而言之,从公共ID到San_Proposta到您的San_Negocio的LEFT JOIN基本上不需要您的标志列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中找到的那些并且代码是相同的值。

现在,您可以浏览所有记录,并通过&#34;标记&#34;将所有状态置于一个状态。列。

发现与否(再次,对你的标志栏没有关系。如果它有钥匙,它在LEFT JOIN上找到。)

如果找不到,那么&#34; HasSameValidaCode&#34;列将设置为&#34; n / a&#34; (不适用),否则,它将被设置为&#34;相同&#34;或&#34;不同&#34;。