Как я могу запретить внутреннему SELECT возвращать NULL? - PullRequest
0 голосов
/ 29 ноября 2009

Как я могу запретить внутреннему SELECT возвращать NULL (когда нет совпадений без строк) и принудительно завершить запрос.

INSERT INTO tt (t1_id, t2_id) VALUES (
  (SELECT id FROM t1 WHERE ...),
  (SELECT id FROM t2 WHERE ...)
);

Дополнительный вопрос: есть ли лучший способ сформировать этот запрос (t1_id, t2_id - внешние ключи, но могут быть NULL)?

Ответы [ 3 ]

6 голосов
/ 29 ноября 2009

Как насчет чего-то вроде:

INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id FROM t1, t2 WHERE ...

Просто убедитесь, что SELECT возвращает именно то, что вы хотите INSERT - поэтому, если возможно, что t1.id и t2.id будут иметь значение NULL, включите соответствующее условие в условие WHERE (... AND t1.id IS NOT NULL AND t2.id IS NOT NULL ... ).

Вы также можете использовать SELECT DISTINCT, если есть вероятность появления повторяющихся строк.

Редактировать: Если вам нужно 2 идентификатора из разных строк одной и той же таблицы:

SELECT t1.id, t2.id FROM some_table AS t1, some_table AS t2
WHERE ...
3 голосов
/ 29 ноября 2009
INSERT INTO tt (t1_id, t2_id) VALUES (
  (SELECT id FROM t1 WHERE ...),
  (SELECT id FROM t2 WHERE ...)
)
WHERE EXISTS (SELECT id FROM t1 WHERE ...)
AND (SELECT id FROM t2 WHERE ...)

Это может показаться неловким и излишним, но любой ценный SQL-исполнитель не выполнит каждую часть дважды.

В качестве альтернативы, если t1 и t2 связаны каким-либо образом:

INSERT INTO tt (t1_id, t2_id)
SELECT t1.id, t2.id
FROM t1
JOIN t2 ON ...
WHERE ...
0 голосов
/ 29 ноября 2009

Это можно улучшить и использовать, как указано ниже

INSERT INTO tt (t1_id, t2_id)
выберите отдельный t1.id, t2.id
от t1, t2
где t1.id = t2.id
и t1.id не равен нулю
и идентификатор t2 не является нулевым
);

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