Один SQL-запрос, чтобы проверить, содержит ли какая-либо таблица строку с column = x - PullRequest
2 голосов
/ 09 февраля 2010

У меня есть две несвязанные таблицы A и B, которые имеют ограничения внешнего ключа для C. Мне нужно выполнить запрос sql, который определяет, содержат ли A или B заданный идентификатор C. Мой первый подход заключался в использовании объединения all но A и B не связаны между собой, поэтому это не сработает.

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010
Select 1 
From   DUAL
Where Exists ( Select null From Table_A Where a.fk = :id ) OR 
      Exists ( Select null From Table_B Where b.fk = :id );
2 голосов
/ 09 февраля 2010

Вы действительно можете использовать союз, почему бы и нет? Но зачем использовать UNION ALL, а не только UNION? Просто выберите один общий столбец:

SELECT 1 
FROM 
       (select A.fk from A inner join C on A.FK = C.pk 
        UNION 
        select B.fk from B inner join C on B.FK = C.pk) AS bothTables 
WHERE fk = 'desiredValue';

Это будет работать просто замечательно.

Протестировано на следующих таблицах в MySQL, с myValue = 1, просто для проверки.

mysql> select * from A;
+------+--------+------+
| pk   | value  | fk   |
+------+--------+------+
|    1 | ape    |    2 | 
|    2 | fjfjfj |    3 | 
+------+--------+------+
2 rows in set (0.00 sec)

mysql> select * from B;
+------+--------+------+
| pk   | value  | fk   |
+------+--------+------+
|    1 | katt   |    1 | 
|    2 | fjfjfj |    3 | 
+------+--------+------+
2 rows in set (0.00 sec)

mysql> select * from C;
+------+-------+
| pk   | value |
+------+-------+
|    1 | hei   | 
|    2 | nei   | 
|    3 | jeg   | 
+------+-------+
3 rows in set (0.00 sec)
1 голос
/ 09 февраля 2010

Не на 100% уверен, что вы спрашиваете, но если вы хотите вернуть элементы A и B, которые соответствуют идентификатору в C, тогда это будет сделано.


Select c.*, a.*, b.*
From c.id
    Left Outer Join a On a.id  = c.id
    Left Outer Join b On b.id = c.id
Where c.id = @somevalue and (a.id Is Not Null or b.id Is Not Null)

Где @somevalue - это значение, которое вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...