Mysql SQL:选择在另一个表中不具有值的ID/值组合
所以基本上就是这个问题(我把它变成了一个更普遍的问题,以防人们将来需要类似的东西) 我有一张桌子(“人”),基本上就是这样Mysql SQL:选择在另一个表中不具有值的ID/值组合,mysql,sql,sql-server,database,sql-server-2008,Mysql,Sql,Sql Server,Database,Sql Server 2008,所以基本上就是这个问题(我把它变成了一个更普遍的问题,以防人们将来需要类似的东西) 我有一张桌子(“人”),基本上就是这样 ╔══════════╦═══════╗ ║ PersonID ║ Letter║ ╠══════════╬═══════╣ ║ 1 ║ A ║ ║ 1 ║ B ║ ║ 1 ║ C ║ ║ 1 ║ D ║ ║ 2 ║ A ║ ║ 2 ║ B ║
╔══════════╦═══════╗
║ PersonID ║ Letter║
╠══════════╬═══════╣
║ 1 ║ A ║
║ 1 ║ B ║
║ 1 ║ C ║
║ 1 ║ D ║
║ 2 ║ A ║
║ 2 ║ B ║
║ 2 ║ C ║
║ 3 ║ B ║
║ 3 ║ C ║
║ 4 ║ A ║
║ 4 ║ C ║
║ 4 ║ D ║
║ 5 ║ E ║
╚══════════╩═══════╝
假设我有另一个表格(“字母”),可以列出一个人可能拥有的所有“字母”
╔══════════╦══════╗
║ LetterID ║ Text ║
╠══════════╬══════╣
║ 1 ║ A ║
║ 2 ║ B ║
║ 3 ║ C ║
║ 4 ║ D ║
║ 5 ║ E ║
╚══════════╩══════╝
我需要做一个新的表格,列出所有的人和他们没有的字母。对于这个例子,结果是这样的
╔══════════╦══════════════╗
║ PersonID ║ LetterNotHad ║
╠══════════╬══════════════╣
║ 1 ║ E ║
║ 2 ║ D ║
║ 2 ║ E ║
║ 3 ║ A ║
║ 3 ║ D ║
║ 3 ║ E ║
║ 4 ║ B ║
║ 4 ║ E ║
║ 5 ║ A ║
║ 5 ║ B ║
║ 5 ║ C ║
║ 5 ║ D ║
╚══════════╩══════════════╝
非常感谢您的任何帮助或指导
编辑:基本上我就是这么想的,像这样的
select p.PersonId, l.value
from letters l
left join people p
on l.Text = p.Letter
where p.personid is null
这是我的想法
WITH cte
AS (SELECT *
FROM (SELECT DISTINCT personid
FROM people) B
CROSS JOIN (SELECT DISTINCT Text as letter
FROM letters) A)
SELECT *
FROM cte c
WHERE NOT EXISTS (SELECT 1
FROM first_table f
WHERE c.personid = f.personid
AND c.letter = f.letter)
注意:您需要在
People
表中使用letterid
,而不是Letter
,并定义一个外键,使表保持一致,因此要查找缺少的值,您要做的是生成表示所有可能值的集合。这是两个集合(人物和字母)之间的笛卡尔积,在SQL中,您使用交叉联接
运算符(或非限定联接)来实现这一点
从这个集合中,您希望删除您已经拥有的组合,剩下的将是缺少的组合
有很多方法可以做到这一点;使用左连接时,它可能如下所示:
select sub.*
from (
select distinct personid, text
from people
cross join letters
) sub
left join people p on p.letter = sub.text and p.personid = sub.personid
where p.personid is null
或者使用except
set操作符(对于MSSQL(在Oracle中减去)
)-MySQL没有此选项:
您已经将其标记为MySQL和SQL Server(-2008),是哪一个?
select personid, text from people cross join letters
except
select personid, letter from people