Sql 如何使用subselect执行查询
我在我的查询中遇到了一个问题,我认为这可以通过一个子选择来解决 我有一个名为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的值相同。 我该怎么做 我尝试了以下查询,但无法正常工作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
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