z-b*_*oss 423 sql t-sql sql-server
table1(id,name)
table2(id,name)
查询:
SELECT name
FROM table2
-- that are not in table1 already
Run Code Online (Sandbox Code Playgroud)
Kri*_*ris 776
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
Run Code Online (Sandbox Code Playgroud)
问:这里发生了什么?
答:从概念上讲,我们选择所有行table1
和我们尝试table2
使用相同值name
列的行来查找每一行.如果没有这样的行,我们只是将table2
结果的部分留空.然后我们通过仅选择匹配行不存在的结果中的那些行来约束我们的选择.最后,我们忽略了结果中的所有字段,除了name
列(我们确定存在的列,来自table1
).
尽管在所有情况下它可能不是最高性能的方法,但它应该在基本上每个尝试实现ANSI 92 SQL的数据库引擎中工作.
fro*_*die 219
你可以这样做
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Run Code Online (Sandbox Code Playgroud)
要么
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table1
WHERE table1.name = table2.name)
Run Code Online (Sandbox Code Playgroud)
有关实现此目的的3种技术,请参阅此问题
Tan*_*aei 71
我没有足够的代表来推荐第二个答案.但我不同意对最佳答案的评论.第二个答案:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Run Code Online (Sandbox Code Playgroud)
FAR在实践中是否更有效率.我不知道为什么,但是我在800k +记录中运行它,差异很大,因为上面给出的第二个答案给出了优势.只需我0.02美元
Win*_*ter 37
这是您可以通过minus
操作实现的纯粹集合理论.
select id, name from table1
minus
select id, name from table2
Run Code Online (Sandbox Code Playgroud)
Anu*_*raj 25
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
Run Code Online (Sandbox Code Playgroud)
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
小智 15
留意陷阱.如果包含Null 的字段Name
,Table1
您会感到惊讶.更好的是:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Run Code Online (Sandbox Code Playgroud)
小智 13
这对我来说最有效.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Run Code Online (Sandbox Code Playgroud)
这是我尝试的任何其他方法的两倍多.
您可以EXCEPT
在mssql或MINUS
oracle中使用它们,它们完全相同:
那项工作对我来说很敏感
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Run Code Online (Sandbox Code Playgroud)
上述所有查询在大表上都非常慢。需要改变策略。这是我用于我的数据库的代码,您可以音译更改字段和表名称。
这就是策略:创建两个隐式临时表并将它们联合起来。
看起来不太优雅,但它比上述所有解决方案快几个数量级。
重要提示:启用要检查的列上的索引。
SELECT name, source, id
FROM
(
SELECT name, "active_ingredients" as source, active_ingredients.id as id
FROM active_ingredients
UNION ALL
SELECT active_ingredients.name as name, "UNII_database" as source, temp_active_ingredients_aliases.id as id
FROM active_ingredients
INNER JOIN temp_active_ingredients_aliases ON temp_active_ingredients_aliases.alias_name = active_ingredients.name
) tbl
GROUP BY name
HAVING count(*) = 1
ORDER BY name
Run Code Online (Sandbox Code Playgroud)
您可以使用以下查询结构:
SELECT t1.name FROM table1 t1 JOIN table2 t2 ON t2.fk_id != t1.id;
表格1 :
ID | 姓名 |
---|---|
1 | 阿米特 |
2 | 萨加尔 |
表2:
ID | 外键ID | 电子邮件 |
---|---|---|
1 | 1 | amit@ma.com |
输出:
姓名 |
---|
萨加尔 |
归档时间: |
|
查看次数: |
741160 次 |
最近记录: |