2012-01-26 40 views
1

我在加入查詢時遇到了一些問題。我想要的是選擇具有一些相似狀態的兩個表的行,其他沒有。我有一個狀態等價觀點加入獲取有關查詢的錯誤信息

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 

不知怎的,我獲得關於equivalentID

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

錯誤信息,我不知道發生了什麼..因爲Statename的是正確的,但STATEID顯示錯誤信息

表可能顯示此:

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

什麼是你的實際查詢? 'WHERE sales.ID = 1'與結果不符,也就是'equivalent.ID'與'StatesEquivalence as equivalence' .. – Blorgbeard

+0

根據您的描述和您顯示的查詢,我發現它沒有任何問題。如果結果行來自銷售或訂單,您可以發佈您所期望的內容並添加評論。另外,要完整。我希望ID 15在結果中,但事實並非如此。 –

+0

是它匹配,因此它給出了銷售表的第一行。 – jcvegan

回答

1

我不認爲你向我們展示了真正的問題代碼。我做了以下內容:

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 

所以,它的工作原理。你可以嘗試上面的代碼嗎?

+0

這不重要爲最終的結果,但你已經切換了「拒絕/被接受」的記錄 –

+0

糟糕,謝謝..修復。 – Blorgbeard

0

我不明白你需要的究竟是什麼,但也許是這樣嗎?

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

這是一個起點,也許......

1

以下是testcript和您的語句的輸出。
也許從這裏開始工作會更容易,而且你告訴我們這個輸出有什麼問題。

的testscript可以調整並執行here

輸出

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

我認爲是因爲在我的銷售表上我有更多的狀態,不在等值表 – jcvegan

+0

@JuanCarlosVegaNeira - 這並沒有爲我清除任何東西。你可以添加一個(或更多)記錄到測試腳本,告訴我們結果不是你期望的結果嗎? –