“我的列”为ART.CODE
,其他表为CST,CSTTD,ACQ,SCON,PROMO
在这些表中,“代码”称为“ U_Code”。这些辅助表中的代码可以为null。我必须验证至少一个辅助表中是否存在“代码”,我尝试使用左连接,但是由于“表”中的代码永远不会为空,因此它始终会还原一个值……我不知道如何如果查询所用的查询不如问题表那么多,那么就这样做。在第一次比赛时,我就停止了。
答案 0 :(得分:0)
如果仅需要ART.UCODE,则将相关子查询与not exists
一起使用
在我看来,这是“最好的”,这可以确保在任何辅助表的U_CODE字段中都不存在ART.CODE。在相关中,我们只关心是否找到匹配项就不会返回什么数据。我们在这里所做的只是确保给定的ART.CODE在任何辅助表中都不存在。一旦找到一个匹配项,引擎就可以早日存在。不像左联接。
我希望这种方法更高效,更易于维护,特别是如果U_CODE是每个表中的外键并对其进行索引的话。
SELECT ART.CODE
FROM ART
WHERE not exists (SELECT 1 FROM CST WHERE ART.CODE = CST.U_CODE)
and not exists (SELECT 1 FROM CSTTD WHERE ART.CODE = CSTTD.U_CODE)
and not exists (SELECT 1 FROM ACQ WHERE ART.CODE = ACQ.U_CODE)
and not exists (SELECT 1 FROM SCON WHERE ART.CODE = SCON.U_CODE)
and not exists (SELECT 1 FROM PROMO WHERE ART.CODE = PROMO.U_CODE)
在合并所有ucode之后,您可以简单地让join合并并检查NULL。如果任何表中都不存在u_code,则合并时将返回null,而这些是您要使用的。
但是,由于您尚未定义这些表之间的相互关系,因此可能导致记录超出所需数量,因为我不知道实际的关系是什么,并且性能会受到影响。
SELECT ART.CODE
FROM ART
LEFT JOIN CST
on ART.CODE = CST.U_CODE
LEFT JOIN CSTTD
on ART.CODE = CSTTD.U_CODE
LEFT JOIN ACQ
on ART.CODE = ACQ.U_CODE
LEFT JOIN SCON
on ART.CODE = SCON.U_CODE
LEFT JOIN PROMO
on ART.CODE = PROMO.U_CODE
WHERE coalesce(CST.UCODE, CSTTD.UCODE, QCQ.U_CODE, SCON.U_CODE, SCON.U_CODE) is null
第三种方法,只是因为我很开心,所以将所有子表的结果合并,然后检查是否存在u_Code。但是在性能方面,对联合所做的隐式区分会否定索引的使用,因此,这取决于记录量会很慢;但是从维护的角度来看,我比所有剩下的联接都更喜欢它,并且这种结合似乎很糟糕。
SELECT ART.CODE
FROM ART
LEFT JOIN (SELECT U_CODE FROM CST UNION
SELECT U_CODE FROM CSTTD UNION
SELECT U_CODE FROM ACQ UNION
SELECT U_CODE FROM SCON UNION
SELECT U_CODE FROM PROMO) Z
on ART.CODE = Z.U_CODE
WHERE Z.U_CODE Is null