2009-09-08 2 views
0
Table 1: 
Name, x1-X2, fk1, fk2. 
Table 2: 
K1(parent for table 1),X 

Как обновить таблицу 1, чей второй столбец x1-x2 Depands на fK1, ФК2 из таблицы 2Oracle Sql Обновление со значениями с использованием внешнего ключа?

Table1: 
a,1.0,1,2 
b,-3.0,2,3 

Table 2 
1,4.0 
2,5.0 
3,2.0 
+0

Поскольку у вас есть X1 и X2 в таблице 2, зачем вам нужны fk1 и fk2. Вы не можете использовать только один? –

+0

, потому что таблица 1 имеет 2 строки, сопоставленные с таблицей 2 –

+0

Итак, какие строки (-ы) соответствуют x1 и x2? –

ответ

2

с помощью этой установки:

CREATE TABLE table2 (k NUMBER PRIMARY KEY, x NUMBER); 
CREATE TABLE table1 (
    NAME VARCHAR2(10) PRIMARY KEY, 
    diff NUMBER, 
    fk1 NUMBER REFERENCES table2, 
    fk2 NUMBER REFERENCES table2); 

следующее обновление будет «обновить» в Колум table1.diff со значениями table2:

SQL> UPDATE (SELECT child.diff old_diff, parent2.x - parent1.x new_diff 
    2   FROM table1 child 
    3   JOIN table2 parent1 ON (child.fk1 = parent1.k) 
    4   JOIN table2 parent2 ON (child.fk2 = parent2.k)) 
    5  SET old_diff = new_diff 
    6 WHERE old_diff != new_diff 
    7  OR (old_diff IS NULL AND new_diff IS NOT NULL) 
    8  OR (old_diff IS NOT NULL AND new_diff IS NULL); 

только те строки, которые нуждаются в обновлении, будет обновляться (благодаря где п).

+0

Можете ли вы действительно обновить такое выражение? Я ожидаю увидеть UPDATE table1 SET diff = (SELECT ...) WHERE (...); и SELECT будет похож на то, что у вас есть - с помощью только new_diff - и последняя тройная точка будет условием, аналогичным тому, что у вас есть. –

+0

Да, Jonathan, так как мы обновляем только дочернюю таблицу, а соединение сохраняет ключ (для каждого соединения одна строка из таблицы 1 указывает на не более одной строки таблицы2 с этим соединением). Обновление сохраняемых ключом подзапросов доступно с по меньшей мере 8i. –

0

Не совсем уверен, что я понимаю вопрос, реляционные ограничения целостности не мешают вам обновить таблицу , Если вам нужно много работать в транзакции, вы можете посмотреть на Отложенные ограничения. Есть ли шанс, что вы можете прояснить, что вы имеете в виду?

+0

обновил qn.is, что сейчас ок? –

0

Не уверен, в чем проблема, может быть, вам нужно немного перефразировать вопрос.

В общем случае ограничение внешнего ключа гарантирует, что в указанной таблице существует соответствующая строка.

Когда вы обновляете строку с помощью внешнего ключа и пытаетесь установить значение, которое не указывает на такую ​​ведущую строку, вы получите ошибку либо немедленно, либо когда вы совершаете фиксацию (в зависимости от того, когда принудительное принуждение , его можно отложить).

Кроме этого, обновление ничем не отличается от любого другого обновления.

+0

обновил qn.is, что сейчас? –

0

Поскольку данные в таблице 1 зависят от данных в таблице 2, вы не сможете напрямую «обновить» таблицу 1.

Вы должны будете выполнить обновление на таблице 2, а затем пересчитать таблицу 1.

Вы можете сделать это внутри транзакции или, возможно, триггер на таблицу 2.

Другим вариантом может быть, чтобы иметь таблицу один только удерживает внешние ключи и имя, а затем создает представление, которое вычисляет значение X1-X2.

EDIT

После просмотра данных выборки, я не думаю, что можно однозначно есть таблица 2 будет обновление в результате обновления на таблице 1.

Например, если вы обновляете второй столбец таблицы 1, чтобы быть 43, как вы знаете, какие значения установить конкретные строки таблицы 2 (это может быть 40 и 3, 20 и 23 и т.д.)

+0

Поскольку я работаю над уже созданными таблицами.Я ищу запрос для обновления первой таблицы ... Я вызову этот запрос из своего приложения после обновления в таблице table2 –

+0

Так как таблица 1 (x1-x2), вы теперь знаете, какие значения X для конкретные строки в таблице 2. Если у вас есть столбцы x1 и x2, вы можете это сделать, но я не уверен, что вы можете иначе. Если я чего-то не упущу. –

+0

Извините, он должен сказать «вы не знаете» –

Смежные вопросы