SQL-仅当B不';不存在

SQL-仅当B不';不存在,sql,Sql,我有一条SQL语句(经过修改,因为真正的查询是巨大的): 我得到一张大致如下的桌子: || IDNum || PrimaryAddress || ----------------------------- || 01234 || 1 || || 23456 || 1 || || abcde || 0 || || abcde || 1 || || zyxwv || 0

我有一条SQL语句(经过修改,因为真正的查询是巨大的):

我得到一张大致如下的桌子:

|| IDNum || PrimaryAddress ||
-----------------------------
|| 01234 || 1              ||
|| 23456 || 1              ||
|| abcde || 0              ||
|| abcde || 1              ||
|| zyxwv || 0              ||

我需要一种方法来返回PrimaryAddress为1的所有记录,以及PrimaryAddress为0且IDNum尚未返回PrimaryAddress为1的所有记录。i、 e.在上面的例子中,(abcde | | 0)应该被排除在外,因为(abcde | | 1)存在。

在这种情况下,一个简单的
分组方式
应该适用于您试图做的事情。实际上,您是说希望所有IDNum值都显示一次,PrimaryAddress值对应于最高值(如果存在,则为1,如果不存在,则为0)

假设您需要保留原始查询,因为您正在使用它进行其他工作,您可以使用:

SELECT IDNum, MAX(PrimaryAddress) AS PrimaryAddress
FROM
(
    select tblInfo.IDNum, tblAddress.PrimaryAddress
    from tblInfo
    join tblAddress
    on tblInfo.Agent = tblAddress.Agent
    where (some stuff)
)
GROUP BY IDNum

这应该适用于MS SQL Server和Oracle,但不一定适用于其他DBMS。如果嵌套查询在您使用的DBMS中不起作用,您应该能够用第一次查询的结果填充一个临时表,然后对该表执行分组。

使用
不存在

SELECT tblInfo.IDNum, tblAddress.PrimaryAddress
FROM tblInfo
INNER JOIN tblAddress
    ON tblInfo.Agent = tblAddress.Agent
WHERE tblAddress.PrimaryAddress = 1
OR  ( tblAddress.PrimaryAddress = 0 AND NOT EXISTS
    (
       SELECT 1 FROM tblInfo t2 INNER JOIN tblAddress a2 ON t2.Agent = a2.Agent
       WHERE t2.IDNum = tblInfo.IDNum AND a2.PrimaryAddress = 1
    )
)
我希望这有帮助

select * from tblAddress mainTBL
where mainTBL.primaryaddress = (Case when EXISTS(select t1.IDNUM from tblAddress t1 where
           mainTBL.IDNUM = t1.IDNUM AND t1.primaryAddress = 1)  THEN 1 ELSE 0 END)

检查

您使用的是什么数据库管理系统?最有效的方法可能因DBMS而异。IDNum可以有多个主地址吗?
select * from tblAddress mainTBL
where mainTBL.primaryaddress = (Case when EXISTS(select t1.IDNUM from tblAddress t1 where
           mainTBL.IDNUM = t1.IDNUM AND t1.primaryAddress = 1)  THEN 1 ELSE 0 END)