Оператор SQL для извлечения списка с использованием данных из нескольких таблиц - PullRequest
1 голос
/ 12 февраля 2009

Спасибо за ответ. Вот проблема .... Оилдатасетстатусид (5-11) сопоставлены с лабид = 4. Labid = 4 имеет входные данные для нескольких клиентов, поэтому обновление не может быть выполнено на основе oildatasetstatusid. Обновления должны быть основаны на samplepointid. Вот почему используются 3 таблицы.

Я не знаю SQL, и меня попросили выполнить задачу, выходящую за рамки моего понимания. Наш клиент хочет изменить существующий уровень серьезности, например, изменить с низкого предупреждения (severityid = 7) на низкий (severityid = 18). Информация о серьезности заносится в базу данных сторонней нефтяной лабораторией. Я хочу создать один список, используя информацию из трех разных таблиц, а затем изменить сопоставление серьезности в этом списке. Я предоставил достаточно информации ниже? Может кто-нибудь, пожалуйста, помогите ????

table: samplepoint
 - samplepointid

table: oildataset
 - oildatasetid
 - oillabid (4=R&G)
 - samplepointid

table: Oildatasetstatus
 - Oildatasetid
 - Oildatasetstatusid (5,6,7,8,9,10,11) needs to be changed to (16,17,18,19,20)
    - 5=16
    - 6=17
    - 7,8,9=18
    - 10=19
    - 11=20

Ответы [ 5 ]

1 голос
/ 12 февраля 2009

Я хочу создать один список, используя информацию из трех разных таблиц

Опубликованная схема не содержит фактической информации в таблице точек выборки, так что на самом деле это просто информация из двух таблиц. По сути, я предполагаю, что вы просто хотите объединить значения «oillabid» и «samplepointid» из «oildataset» в каждый ряд «oildatasetstatus»?

SELECT *
FROM oildatasetstatus
JOIN oildataset ON oildataset.oildatasetid=oildatasetstatus.oildatasetid

затем измените сопоставление серьезности в этом списке.

Полагаю, вы хотите сказать, что вы хотите, чтобы ваш запрос имел разную степень серьезности, а не ОБНОВЛЯЕТ вашу сохраненную таблицу 'oildatasetstatus'? Если это так, вы можете использовать оператор CASE:

SELECT
    oildataset.oildatasetid, oildataset.oillabid, oildataset.samplepointid,
    CASE oildatasetstatus.oildatasetstatusid
        WHEN 5 THEN 16
        WHEN 6 THEN 17
        WHEN 7 THEN 18
        WHEN 8 THEN 18
        WHEN 9 THEN 18
        WHEN 10 THEN 19
        WHEN 11 THEN 20
    END AS newstatus
FROM oildatasetstatus
JOIN oildataset ON oildataset.oildatasetid=oildatasetstatus.oildatasetid
1 голос
/ 12 февраля 2009

Для повторения тяжелых байтов: будьте осторожны!

Полезный совет: не пишите операторов UPDATE или DELETE, пока вы не знаете, на что они будут влиять. Это относительно просто, потому что вы можете создать оператор SELECT с тем же предложением where.

например:

UPDATE Oildatasetstatus SET Oildatasetstatusid=18 
WHERE Oildatasetstatusid IN (7, 8, 9)

становится:

SELECT * FROM Oildatasetstatus 
WHERE Oildatasetstatusid IN (7, 8, 9)

Или вы можете сделать это с комментариями, чтобы вы могли легко превратить его в оператор обновления, когда захотите его выполнить:

-- UPDATE Oildatasetstatus SET Oildatasetstatusid=18 
SELECT * FROM
WHERE Oildatasetstatusid IN (7, 8, 9)
1 голос
/ 12 февраля 2009

Я не знаю, придется ли вам что-то еще делать, но если вы просто хотите заменить эти серьезности, сделайте следующее:

ОБНОВЛЕНИЕ Oildatasetstatusid SET Oildatasetstatusid = 16 ГДЕ Oildatasetstatusid = 5;

ОБНОВЛЕНИЕ Oildatasetstatusid SET Oildatasetstatusid = 17 ГДЕ Oildatasetstatusid = 6;

ОБНОВЛЕНИЕ Oildatasetstatus SET Oildatasetstatusid = 18 ГДЕ Oildatasetstatusid IN (7, 8, 9);

ОБНОВЛЕНИЕ Oildatasetstatusid SET Oildatasetstatusid = 19 ГДЕ Oildatasetstatusid = 10;

ОБНОВЛЕНИЕ Oildatasetstatusid SET Oildatasetstatusid = 11 ГДЕ Oildatasetstatusid = 20;

Если Oildatasetid является первичным ключом, чем это следует сделать.

Будьте осторожны и сделайте резервную копию данных.

Какая связь между Oildatasetstatus и oildataset ?

1 голос
/ 12 февраля 2009

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

Синтаксис нескольких таблиц UPDATE является нестандартным SQL и поддерживается только Microsoft SQL Server и MySQL. Вот пример (не проверенный) для MS SQL:

UPDATE Oildatasetstatus
SET Oildatasetstatusid = 
  CASE Oildatasetstatusid
    WHEN 5 THEN 16
    WHEN 6 THEN 17
    WHEN 7 THEN 18
    WHEN 8 THEN 18
    WHEN 9 THEN 18
    WHEN 10 THEN 19
    WHEN 11 THEN 20
    ELSE Oildatasetstatusid
  END CASE
FROM Oildatasetstatus
  JOIN Oildataset USING (Oildatasetid)
WHERE Oildataset.Oillabid = 4;

Если вы не уверены в SQL, , пожалуйста сначала запустите эту копию ваших данных и убедитесь, что она работает так, как вы ожидаете!

0 голосов
/ 12 февраля 2009
update Oildatasetstatus
set Oildatasetstatusid = 16
where Oildatasetstatusid  = 5

- и затем выполнить аналогичную команду для каждого из других идентификаторов состояния

Если вы хотите получить отчет позже, вы должны выполнить что-то вроде этого:

select s.samplepointid
, ods.oildatasetid
, ods.oillabid
, odss.oildatsetstatusid
from samplepoint s
, oildataset ods
, oildatasetstatus odss
where ods.samplepointid = s.samplepointid
and odss.oildatasetid = ods.oildatassetid
order by s.samplepointid
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...