Как я могу запретить внутреннему SELECT возвращать NULL?

0

Как я могу запретить внутреннему 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)?

  • 1
    Лучший способ заставить запрос завершиться ошибкой, если любое из значений равно NULL, - использовать инструкцию ALTER TABLE чтобы изменить два столбца, чтобы они не допускали значений NULL .
  • 0
    Вы все равно можете получить значения NULL в tt, если один из внутренних операторов SELECT не возвращает строк ...
Показать ещё 3 комментария
Теги:
database
null

3 ответа

6
Лучший ответ

Как насчет чего-то типа:

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 ...
  • 0
    Это, безусловно, улучшение. а как насчет проблемы NULL? Я не хочу вставлять NULL.
  • 2
    @ Łukasz Lew: если одно из условий не возвращает строк, весь запрос не возвращает строк и не вставляется ни одной строки.
Показать ещё 3 комментария
3
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 ...
  • 1
    Нет, любой достойный исполнитель SQL НЕ будет выполнять SELECT дважды.
  • 0
    Они не должны быть связаны. SimonJ дал правильный ответ.
0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню