mySql-在第二个表中搜索不带引用的行

mySql-在第二个表中搜索不带引用的行,mysql,Mysql,我有两张桌子 如何在第一个表中搜索第二个表中没有引用的所有行 连接字段为:res_srvs.id=inv_supp2srv.srvID 所以,我想得到表“inv_supp2srv”中没有srvID的所有表“res_srv”行 表:res_SRV Collation Attributes id int(11) clientID int(6) resNum int(9) net decimal(7,2) tax decimal(7,2) from_date(date) 表:inv_s

我有两张桌子

如何在第一个表中搜索第二个表中没有引用的所有行

连接字段为:res_srvs.id=inv_supp2srv.srvID

所以,我想得到表“inv_supp2srv”中没有srvID的所有表“res_srv”行

表:res_SRV

Collation   Attributes
id  int(11)
clientID    int(6)
resNum  int(9)
net decimal(7,2)
tax decimal(7,2)
from_date(date)
表:inv_supp2srv

Collation   Attributes
clientID    int(6)
invNum  int(10)
srvID   int(11)
amount  decimal(7,2)
valid   tinyint(1)
这就是我所尝试的:

SELECT srv.net , srv.tax , srv.net+srv.tax AS amount, srv.id AS srv_id
FROM res_srvs AS srv , inv_supp2srv AS i2s 
WHERE srv.clientID = 1 
AND srv.from_date >= '2020-03-01' 
AND i2s.clientID = 1 
AND i2s.srvID = srv.id 
AND (NOT EXISTS
    (
    SELECT *
    FROM inv_supp2srv AS i2s
    WHERE i2s.srvID = srv.id
    )
) 
我想获取表
inv\u supp2srv
中没有
srvID
的所有表
resu srv

看起来你把这个复杂化了。我看不出外部查询中表之间的
连接有什么意义-它试图匹配表,这与
不存在
条件相矛盾

我想你只是想:

select r.*
from res_srvs r
where  
    r.from_date >= '2020-03-01' 
    and r.clientID = 1
    and not exists (
        select 1
        from inv_supp2srv i
        where i.srvID = r.id and i.clientID = r.clientID
    )
我不确定您是否想在correlation子句中使用
clientID
——您的查询使它看起来像是这样,所以我添加了它

我想获取表
inv\u supp2srv
中没有
srvID
的所有表
resu srv

看起来你把这个复杂化了。我看不出外部查询中表之间的
连接有什么意义-它试图匹配表,这与
不存在
条件相矛盾

我想你只是想:

select r.*
from res_srvs r
where  
    r.from_date >= '2020-03-01' 
    and r.clientID = 1
    and not exists (
        select 1
        from inv_supp2srv i
        where i.srvID = r.id and i.clientID = r.clientID
    )

我不确定您是否想在correlation子句中使用
clientID
,您的查询使它看起来像是这样,所以我添加了它。

您想要的是带排除的左外联接:


您需要的是带排除的左外部联接:


您可以对第二个表使用
LEFT JOIN
,并通过
NULL
连接值进行筛选,如:

SELECT srv.net , srv.tax , srv.net+srv.tax AS amount, srv.id AS srv_id
FROM res_srvs AS srv 
LEFT JOIN inv_supp2srv AS i2s ON i2s.srvID = srv.id 
WHERE 
    srv.clientID = 1 
    AND srv.from_date >= '2020-03-01' 
    -- AND i2s.clientID = 1 not relevant condition
    AND i2s.srvID IS NULL;
另一种方法是使用
不存在
条件:

SELECT srv.net , srv.tax , srv.net+srv.tax AS amount, srv.id AS srv_id
FROM res_srvs AS srv 
WHERE 
    srv.clientID = 1 
    AND srv.from_date >= '2020-03-01' 
    AND NOT EXISTS (
        SELECT srvID FROM inv_supp2srv AS i2s WHERE i2s.srvID = srv.id 
    );

您可以对第二个表使用
LEFT JOIN
,并通过
NULL
连接值进行筛选,如:

SELECT srv.net , srv.tax , srv.net+srv.tax AS amount, srv.id AS srv_id
FROM res_srvs AS srv 
LEFT JOIN inv_supp2srv AS i2s ON i2s.srvID = srv.id 
WHERE 
    srv.clientID = 1 
    AND srv.from_date >= '2020-03-01' 
    -- AND i2s.clientID = 1 not relevant condition
    AND i2s.srvID IS NULL;
另一种方法是使用
不存在
条件:

SELECT srv.net , srv.tax , srv.net+srv.tax AS amount, srv.id AS srv_id
FROM res_srvs AS srv 
WHERE 
    srv.clientID = 1 
    AND srv.from_date >= '2020-03-01' 
    AND NOT EXISTS (
        SELECT srvID FROM inv_supp2srv AS i2s WHERE i2s.srvID = srv.id 
    );


嗯,查询要长得多,所以我需要其他员工的联接…@roi:您想要其他表中不存在的行,所以我不明白您为什么要联接它。嗯,查询要长得多,所以我需要其他员工的联接…@roi:您想要其他表中不存在的行,所以我不明白你为什么想加入。嗨,西德。非常感谢,但是我在这里写的选择是一个更大的选择的一部分。那么有没有可能在哪里写下。。。。并且不存在于第二个表中?无论查询大小如何,左联接都将执行得最好。只要srvID是您要检查的唯一列,上述条件就可以工作。如果有多个列,您可以在联接查询中添加“AND”。@roi您可以,但我更喜欢使用
join
s,它可以使查询更清晰,执行起来更快。为了给出准确的答案,欢迎提供数据样本、表格结构和预期结果。(在示例中的a中)Hi Cid。非常感谢,但是我在这里写的选择是一个更大的选择的一部分。那么有没有可能在哪里写下。。。。并且不存在于第二个表中?无论查询大小如何,左联接都将执行得最好。只要srvID是您要检查的唯一列,上述条件就可以工作。如果有多个列,您可以在联接查询中添加“AND”。@roi您可以,但我更喜欢使用
join
s,它可以使查询更清晰,执行起来更快。为了给出准确的答案,欢迎提供数据样本、表格结构和预期结果。(在一个例子中)你好,斯拉瓦。谢谢,但我在这里写的选择是一个更大的选择的一部分。那么有没有可能在哪里写下。。。。而不存在于第二张表中?@roi,当然可以。我在回答中加入了这种方法。两个查询应该返回相同的结果,只是您需要测试哪一个提供更好的性能。我认为您在
不存在之前错过了
,没有?当然@roi,已修复。再次谢谢你好,斯拉瓦。谢谢,但我在这里写的选择是一个更大的选择的一部分。那么有没有可能在哪里写下。。。。而不存在于第二张表中?@roi,当然可以。我在回答中加入了这种方法。两个查询应该返回相同的结果,只是您需要测试哪一个提供更好的性能。我认为您在
不存在之前错过了
,没有?当然@roi,已修复。非常感谢。