2013-03-08 73 views
1

我有一桌子的人:选择缺少的条目

person_id | name 
1   | bob 
2   | jane 

问题的表格,他们可以回答:

qu_id | question 
1  | How old are you? 
2  | How tall are you? 

和答案的一个表:

answer_id | qu_id | person_id | answer 
10  | 1  | 2   | 24 

什么查询会返回人员列表和未回答的问题:

例如,未答复的问题:

qu_id | person_id 
1  | 1 
2  | 1 
2  | 2 

(我使用SQL Server Express 2012)

+0

我想输出是错误的。根据你的情况,只有person_id no 2已经回答了问题1 – DevelopmentIsMyPassion 2013-03-08 12:26:47

+0

谢谢@AshReva,你是对的! – noelicus 2013-03-08 12:30:15

回答

1
SELECT b.qu_ID, a.person_ID 
FROM people a 
     CROSS JOIN question b 
     LEFT JOIN answer c 
      ON a.person_ID = c.person_ID AND 
       b.qu_ID = c.qu_id 
WHERE c.person_ID IS NULL 
ORDER BY b.qu_id, a.person_id 

结果

╔═══════╦═══════════╗ 
║ QU_ID ║ PERSON_ID ║ 
╠═══════╬═══════════╣ 
║  1 ║   1 ║ 
║  2 ║   1 ║ 
║  2 ║   2 ║ 
╚═══════╩═══════════╝ 
+1

我想你的意思是'NULL'而不是'NOT NULL' – 2013-03-08 12:33:18

+0

@lc。对,我把错误的数据粘贴在小提琴上,而不是答案表上,我发布了期望的结果。 – 2013-03-08 12:36:51

+1

我喜欢这个答案,因为如果需要的话,我可以在主'SELECT'中引用更多的列。使用'EXCEPT'不允许。 – noelicus 2013-03-11 11:20:30

1
SELECT q.qu_id, p.person_id 
FROM people AS p 
CROSS JOIN questions AS q 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM answers AS a 
    WHERE a.qu_id = q.qu_id 
    AND a.person_id = p.person_id 
) 

或者,

SELECT q.qu_id, p.person_id 
FROM people AS p 
CROSS JOIN questions AS q 
EXCEPT 
SELECT qu_id, person_id 
FROM answers 
4
SELECT p.person_id, q.qu_id 
FROM Person p 
CROSS JOIN Question q 

EXCEPT 

SELECT person_id, qu_id 
FROM Answers 
+0

+1干净简单的尼斯.. – 2013-03-08 12:44:01