代码之家  ›  专栏  ›  技术社区  ›  Frosty840

如何选择其他表中没有匹配项的行?

  •  255
  • Frosty840  · 技术社区  · 14 年前

    我正在一个数据库应用程序上做一些维护工作,我发现joy s of joys,即使一个表中的值是以外键的方式使用的,但是表上没有外键约束。

    我在网上找到了一些此类查询的示例,但它们似乎都提供了示例而不是解释,我不明白它们为什么有效。

    有人能给我解释一下如何构造一个查询,它返回另一个表中没有匹配项的所有行,以及它在做什么,这样我就可以自己进行这些查询,而不是为这个表中的每个表运行 混乱 没有FK约束?

    9 回复  |  直到 7 年前
        1
  •  569
  •   Toby Speight    8 年前

    下面是一个简单的查询:

    SELECT t1.ID
    FROM Table1 t1
        LEFT JOIN Table2 t2 ON t1.ID = t2.ID
    WHERE t2.ID IS NULL
    

    重点是:

    1. LEFT JOIN 使用;这将返回 Table1 Table2 .

    2. 这个 WHERE t2.ID IS NULL 表2 是空的-换句话说 表2 为了那个特殊的身份证 表1 Table2.ID 对于来自的所有记录,将返回为空 表1 其中ID不匹配 表2 .

        2
  •  88
  •   Ondrej Bozek    8 年前

    我会用 EXISTS LEFT JOIN 你必须把联合表中的所有东西都拿走。其效率可能与 左连接

    SELECT t1.ID
    FROM Table1 t1
    WHERE NOT EXISTS (SELECT t2.ID FROM Table2 t2 WHERE t1.ID = t2.ID)
    
        3
  •  13
  •   zb226 Steven Lizarazo    5 年前
    SELECT id FROM table1 WHERE foreign_key_id_column NOT IN (SELECT id FROM table2)
    

    表1中有一列要添加外键约束,但 foreign_key_id_column id 在表2中。

    1. 初始选择列出 来自表1。这些将是我们要删除的行。
    2. 这个 NOT IN where语句中的子句将查询限制为 不在表2中 s。
    3. 这个 SELECT 身份证件 在表2中。
        4
  •  8
  •   zb226 Steven Lizarazo    5 年前

    在哪里? T2 是要向其添加约束的表:

    SELECT *
    FROM T2
    WHERE constrained_field NOT
    IN (
        SELECT DISTINCT t.constrained_field
        FROM T2 
        INNER JOIN T1 t
        USING ( constrained_field )
    )
    

    删除结果。

        5
  •  4
  •   spicy.dll    5 年前

    我们有以下两张表(工资和雇员) enter image description here

    我们可以通过三种方式做到这一点:

    1. 使用内部联接
    select * from employee
    where id not in(select e.id from employee e inner join salary s on e.id=s.id)
    

    enter image description here

    1. 使用左外连接
    select * from employee e 
    left outer join salary s on e.id=s.id  where s.id is null
    

    enter image description here

    select * from employee e
    full outer join salary s on e.id=s.id where e.id not in(select id from salary)
    

    enter image description here

        6
  •  1
  •   Luis H Cabrejo    6 年前

    类似的问题 MySQL Inner Join Query To Get Records Not Present in Other Table 我要用这个

    SELECT * FROM bigtable 
    LEFT JOIN smalltable ON bigtable.id = smalltable.id 
    WHERE smalltable.id IS NULL
    

    smalltable 是你丢失记录的地方, bigtable 是你所有记录的地方。查询列出不存在的所有记录。 但存在于 大表 id 任何其他匹配条件。

        7
  •  0
  •   Nitesh singh    6 年前

    你可以选择 如下图所示:

    CREATE VIEW AuthorizedUserProjectView AS select t1.username as username, t1.email as useremail, p.id as projectid, 
    (select m.role from userproject m where m.projectid = p.id and m.userid = t1.id) as role 
    FROM authorizeduser as t1, project as p
    

    然后在视图上进行选择或更新:

    select * from AuthorizedUserProjectView where projectid = 49
    

    其产生如下图所示的结果,即对于不匹配的列,已填充空值。

    [Result of select on the view][1]
    
        8
  •  0
  •   William Desportes    5 年前

    )但这个在我使用时似乎更快(至少对我来说)

    SELECT id  FROM  table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2
    

    SELECT COUNT(*) FROM table_1 where id in (SELECT id  FROM  table_1 EXCEPT SELECT DISTINCT (table1_id) table1_id FROM table_2);
    
        9
  •  -1
  •   Muhammad Parwej    5 年前

    从第一张表中选择* 减

        10
  •  -2
  •   Hiren Makwana    5 年前

    你可以这样做

       SELECT IFNULL(`price`.`fPrice`,100) as fPrice,product.ProductId,ProductName 
              FROM `products` left join `price` ON 
              price.ProductId=product.ProductId AND (GeoFancingId=1 OR GeoFancingId 
              IS NULL) WHERE Status="Active" AND Delete="No"
    
        11
  •  -6
  •   user6341745    6 年前

    如何在两个表中选择没有匹配项的行?

        select * from [dbo].[EmppDetails] e
         right join [Employee].[Gender] d on e.Gid=d.Gid
        where e.Gid is Null
    
        union 
        select * from [dbo].[EmppDetails] e
         left join [Employee].[Gender] d on e.Gid=d.Gid
        where d.Gid is Null