Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:选择在另一个表中不具有值的ID/值组合_Mysql_Sql_Sql Server_Database_Sql Server 2008 - Fatal编程技术网

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