我的查询出了问题,我认为可以通过子选择来解决。
我有一个名为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.
我只想做一个
的查询我该怎么做?
我尝试了以下查询,但无法正常使用
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不同。
答案 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;。