Как я могу сделать запрос с подвыбором - PullRequest
0 голосов
/ 01 марта 2012

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

У меня есть таблица с именем San_Proposta, у которой есть первичный ключ с именем Proposta_Id. В этой таблице (San_Proposta) у меня есть несколько столбцов, но определенный столбец называется StatusProposta_Id. StatusProposta_Id может иметь только 2 значения: 1 или 2. Если SanProposta_Id равен 1, то Proposta_Id не существует в таблице с именем San_Negocio, имеющей внешний ключ с именем Proposta_Id. Если StatusProposta_Id равен 2, то Proposta_Id существует в моей таблице под названием San_Negocio.

В San_Negocio у меня есть несколько столбцов, но давайте обратим внимание на 2 столбца, в частности: ValidaVenda и ValidaCaptacao. Оба столбца могут иметь только 2 значения: 1 или 0.

Я хочу сделать только один запрос, который

  • возвращает все данные, которые не существуют в San_Negocio (и как это было сказано раньше, если San_Proposta.Proposta_Id равен 1, то в San_Negocio не существует),
  • возвращает все данные, которые существуют в San_Proposta, но не существуют в San_Negocio (и как быстро сообщить, если San_Proposta.Proposta_Id равен 2, тогда существует в San_Negocio)
  • Если San_Proposta.Proposta_Id существует в моей таблице San_Negocio, (для Proposta_Id существует в моей таблице San_Negocio, значение San_Proposta.StatusProposta_Id имеет значение 2), мой столбец с именем San_Negocio.ValidaVenda не может иметь то же значение SanCoCo, которое не имеет такого же значения для SanCo. .

Как я могу это сделать?

Я пробовал следующий запрос, но не работает правильно

select 
   San_Proposta.Proposta_Id 
from 
   San_Proposta
left outer join 
     (
         select 
           * 
         from 
           San_Negocio 
         where 
           Proposta_Id is not null 
           and ValidaCaptacao <> ValidaVenda
     ) AS Negocio2
      on San_Proposta.Proposta_Id = Negocio2.Proposta_Id
where 
  San_Proposta.StatusProposta_Id IN (1,2)

@ Обновлено

San_Proposta

Proposta_Id  |  StatusProposta_Id
1               1
2               1
3               1
4               2
5               2
6               2

San_Negocio

Proposta_Id  |  ValidaVenda  | ValidaCaptacao
4               1              0
5               0              1
6               1              1

@ Обновлено

Что я ожидаю

Proposta_Id
1
2
3
4
5

Я хочу, чтобы запрос возвращал Proposta_Id 1,2,3 (потому что не существует в San_Negocio) и Proposta_Id 4, 5, потому что они существуют в San_Negocio, но ValidaVenda отличается от ValidaCaptacao.

Ответы [ 3 ]

1 голос
/ 01 марта 2012
select p.* from San_Proposta p 
where p.StatusProposta_Id = 1

union 

select p.* from San_Proposta p 
    left join San_Negocio n on n.Proposta_Id = p.Proposta_Id
where p.StatusProposta_Id = 2
    and n.ValidaCaptacao <> n.ValidaVenda
0 голосов
/ 01 марта 2012

Очевидно, что вы сделали все возможное для перевода на английский, чтобы получить ответ на свой вопрос. Я понимаю элементы запроса, но не знаю, почему / что вы конкретно пытаетесь получить или исключить. Кроме того, почему все в пределах одного запроса. То, что я предлагаю, это один запрос, чтобы получить все элементы, если они существуют или нет, и только что добавил несколько столбцов «флагов», которые вы можете использовать или не ограничивать позже.

Короче говоря, ЛЕВОЕ СОЕДИНЕНИЕ от San_Proposta к вашему San_Negocio по общему идентификатору в основном устраняет необходимость в столбце вашего флага 1 или 2, чтобы определить, существует ли запись в другой. Если он находит совпадение, отлично, независимо от того, есть ли в файле параметр ложного флага. Оттуда вы можете обнаружить, что префикс IF () совпадает с другими кодами состояния в других ваших столбцах.

select 
      SP.*,
      CASE WHEN SN.Proposta_ID IS NULL THEN "No" ELSE "Yes" END as FoundInSanNegocio       
   from 
      San_Proposta SP
         LEFT JOIN San_Negocio SN
            ON SP.Proposta_ID = SN.Proposta_ID
   WHERE
         SN.Proposta_ID IS NULL
      OR NOT SN.ValidaCaptacao = SN.ValidaVenda

В предложении Имеются ИСКЛЮЧИТЕЛЬНО те, которые найдены в San_Negocio, а коды имеют одинаковое значение.

Теперь вы можете просматривать все записи и иметь все статусы в одном по столбцам «флаг».

Найден или нет (опять-таки, не имеет значения для вашего столбца флага. Если у него есть ключ, он найден в левом соединении).

Если он НЕ БЫЛ найден, тогда для столбца «HasSameValidaCode» будет задано значение «n / a» (не применимо), в противном случае будет установлено значение «То же» или «Разное».

0 голосов
/ 01 марта 2012

Я пытался следовать вашим мыслям о содержании и отношениях, но это довольно сложно.Поэтому я предлагаю вам пересмотреть свой запрос.

РЕДАКТИРОВАТЬ: ОК.спасибо за обновление.

Я бы использовал следующее утверждение.

SELECT san_proposta.proposta_id FROM   san_proposta WHERE  statusproposta_id = 1
UNION ALL
SELECT san_proposta.proposta_id FROM   san_proposta
       JOIN san_negocio ON san_proposta.proposta_id = san_negocio.proposta_id
                       AND san_negocio.validacaptacao <> san_negocio.validavenda  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...