2013-11-28 2 views
0

Скажем, у меня есть три таблицы:SQL запрос, чтобы соответствовать несвязанных данных

TABLE A 

idA  variable 
1  Number of hats 
2  Number of scarves 
3  Number of mittens 


TABLE B 

idB  name 
1  Andy 
2  Betty 
3  Cedric 
4  Daphne 


TABLE C 

idA  idB  value 
1  1  15 
1  2  2 
1  3  89 
2  1  10 
2  3  3 
2  4  1504 
3  2  12 
3  3  4 
3  4  1 

Глядя на таблицу, это относительно просто работать - мы знаем, сколько шляп (2) и варежки (12), что она владеет , но не сколько платков. Точно так же для Дафни мы знаем, сколько шарфов (1504) и варежки (1) она владеет, но не количество шляп.

Однако я хотел бы список полей, что нет информации для - я бы возвращаемый результат ищет что-то вроде этого (если я попросил Энди)

idA  variable 
3  Number of mittens 

Любая идея, как я сделай это? :)

ответ

1

следующий запрос работает:

SELECT B.name, A.variable 
FROM B 
CROSS JOIN A 
LEFT JOIN C ON C.idA = A.idA AND C.idB = B.idB 
WHERE C.value IS NULL 

Его CROSS JOIN, что является ключевым, он говорит JOIN каждой записи в B каждой записи в A. Как только вы это сделаете, вы можете легко проверить, какие комбинации idA и idB не имеют соответствующей записи в C.

Tested on SQLFiddle

Результат:

NAME  UNKNOWN VARIABLE 
------------------------------- 
Andy  Number of mittens 
Betty  Number of scarves 
Daphne  Number of hats 
+0

Прежде чем потрудиться, я сам проверил каждый из ответов на один и тот же SQLFiddle, и никто из них не работает ... – OGHaza

+0

Шляпы к вам, сэр - это именно то, что я был после :) –

1

Вы можете использовать объединения для объединения двух таблиц.

В вашем случае, если вы спросите Энди, и вы хотите знать количество варежки, вы будете иметь:

SELECT name, value 
FROM B 
INNER JOIN C on B.idB = C.idB 
WHERE id.A = 3 

В ответ на ваш комментарий, вы пытаетесь что-то вроде этого:

SELECT name, variable 
FROM B 
RIGHT JOIN C on B.idB = C.idB 
RIGHT JOIN A on C.idA = A.idA 
WHERE C.idA IS NULL 
+0

Спасибо за ответ :) но я не хочу, чтобы знать количество варежки - Я хочу знать, что я * не * знать количество рукавиц для Энди (или, точнее, список вещей, которые я не знаю об Энди) –

0
select idA, variable 
from a 
where idA not in (select idA from c where idB = 1) 
Смежные вопросы