Присоединяйтесь, чтобы получить неверную информацию по запросу - PullRequest
1 голос
/ 26 января 2012

У меня проблемы с запросом на соединение.Что я хочу, это выбрать строки из двух таблиц, которые имеют одни и те же состояния, а другие нет.И у меня есть представление эквивалентности состояния

Table Sales:
ID  .....   StateID
1           1
2           1
3           6

Table Orders
ID  .....   StateID
11          2
12          2
15          3

Table StatesEquivalence
ID  SalesState   OrdersState    StateName
1   1            2              Attended
2   2            3              Declined

Я сделал объединение обеих таблиц (Продажи и Заказы), и я хочу столбец с EquivalentStateID и StateName, выполнив что-то вроде этого:

SELECT sales.ID as ID,equivalence.ID as State,equivalence.StateName
FROM Sales
INNER JOIN StatesEquivalence as equivalence
ON sales.StateID = equivalence.SalesState
WHERE sales.ID = 1
UNION
SELECT orders.ID as ID,equivalence.ID as State,equivalence.StateName
FROM Orders as orders
INNER JOIN StatesEquivalence as equivalence
ON orders.StateID = equivalence.OrdersState

Каким-то образом я получаю неверную информацию об эквивалентном идентификаторе

ID      State        StateName
1       2            Attended
2       2            Attended
11      2            Attended
...

Я не знаю, что произошло .. потому что статическое имя верно, но StateID показывает неверную информацию

Таблица может показать это:

ID      State        StateName
1       1            Attended
2       1            Attended
11      1            Attended
...

Ответы [ 3 ]

1 голос
/ 26 января 2012

Я не думаю, что вы показываете нам реальный код проблемы. Я сделал следующее:

begin transaction

create table sales (id int, stateid int)
create table orders (id int, stateid int)
create table statesequivalence (id int, salesstate int, ordersstate int, statename varchar(20))

insert into sales values (1, 1)
insert into sales values (2, 1)
insert into sales values (3, 6)

insert into orders values (11, 2)
insert into orders values (12, 2)
insert into orders values (15, 3)

insert into statesequivalence values (1, 1, 2, 'Attended')
insert into statesequivalence values (2, 2, 3, 'Declined')

SELECT sales.ID as ID,equivalence.ID as State,equivalence.statename
FROM Sales
INNER JOIN statesequivalence as equivalence
ON sales.StateID = equivalence.SalesState
WHERE sales.ID = 1
UNION
SELECT orders.ID as ID,equivalence.ID as State,equivalence.StateName
FROM Orders as orders
INNER JOIN statesequivalence as equivalence
ON orders.StateID = equivalence.OrdersState

rollback

Результат:

ID          State       statename
----------- ----------- --------------------
1           1           Attended
11          1           Attended
12          1           Attended
15          2           Declined

Итак, это работает. Можете ли вы попробовать приведенный выше код?

1 голос
/ 26 января 2012

Ниже приведен тестовый сценарий и вывод вашего утверждения.
Возможно, отсюда проще работать, и вы скажете нам, что не так с этим выводом.

Тестовый скрипт можно настроить и выполнить здесь

выход

ID          State       StateName
----------- ----------- ---------
1           1           Attended
11          1           Attended
12          1           Attended
15          2           Declined

Тестовый скрипт

;WITH Sales AS (
  SELECT * FROM (VALUES
    (1, 1)
    , (2, 1)
    , (3, 6)
  ) AS Sales (ID, StateID)
)
, Orders AS (
  SELECT * FROM (VALUES
    (11, 2)
    , (12, 2)
    , (15, 3)
  ) AS Orders (ID, StateID)
)
, StatesEquivalence AS (
  SELECT * FROM (VALUES
    (1, 1, 2, 'Attended')
    , (2, 2, 3, 'Declined')
  ) AS StatesEquivalence (ID, SalesState, OrdersState, StateName)
)
SELECT  sales.ID as ID
        , equivalence.ID as State
        , equivalence.StateName
FROM    Sales
        INNER JOIN StatesEquivalence as equivalence ON sales.StateID = equivalence.SalesState
WHERE   sales.ID = 1
UNION
SELECT  orders.ID as ID
        , equivalence.ID as State
        , equivalence.StateName
FROM    Orders as orders
        INNER JOIN StatesEquivalence as equivalence ON orders.StateID = equivalence.OrdersState      
0 голосов
/ 26 января 2012

Я не совсем понял, что вам нужно, но, может быть, это так?

select *
from StatesEquivalence EQ
full join Sales S on EQ.SalesState = S.StateId
full join Orders O on EQ.OrdersState = O.StateId

Возможно, это отправная точка ...

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