2015-08-29 36 views
0

我試圖加入兩個有字符鍵的表,我需要使用SELECT查詢來形成一個加入條件。這裏是數據:SQL JOIN問題 - 複雜SELECT爲JOIN條件

Table M 

MKey OtherData 
---- --------- 
ABCD kjjh 
EFGH oioo 
IJKL uhdjdhu 
MNOP isdid 
QRST lkuh 

Table FUN 

FUNKey BinaryField 
------ ----------- 
ABCD/GGG 1 
ABCD/KKK 0 
ABCD/MMM 1 
EFGH/ABC 1 
IJKL/DDD 1 
IJKL/VVV 1 
IJKL/XXX 0 
MNOP/AAA 1 
NMOP/DEF 1 
NMOP/FFF 1 
QRST/SSS 0 

這兩個表中沒有唯一或數字字段,也沒有其他字段可以連接。

這是我的出發查詢與JOIN:

Select MKey,Otherdata from M 
LEFT OUTER JOIN FUN 
ON M.MKey = left(FUNKey, CHARINDEX ('/', FUNKey) -1) 
AND FUN.BinaryData=1 

Returns 

ABCD kjjh 
ABCD kjjh 
EFGH oioo 
IJKL uhdjdhu 
ABCD kjjh 
MNOP isdid 
MNOP isdid 
MNOP isdid 
MNOP isdid 

我需要什麼返回是從M個一排,其中存在更多的樂趣行以「MKEY」開始,有樂趣之一。 BinaryData = 1,像這樣:

ABCD kjjh 
EFGH oioo 
IJKL uhdjdhu 
MNOP isdid 

我已經嘗試GROUP BY,MIN,MAX在FUN.FUNKey列沒有成功。

如果我使用了一個ROW_NUMBER,OVER和分區等自行查詢我得到了我想要參加什麼:

(Select M_Code from 

(Select left(F.FUNKey, CHARINDEX ('/', F.FUNKey) -1) as M_Code 
,row_number() over (partition by left(F.FUNKey, CHARINDEX ('/', F.FUNKey) -1) 
order by left(F.FUNKey, CHARINDEX ('/', F.FUNKey) -1)) 

as rn 
from FUN F 
where F.BinaryData=1 
) tmp 

Where rn=1 
) 

返回:

ABCD 
EFGH 
IJKL 
MNOP 

所以我覺得我很好,直到我嘗試將它用於連接:

The following code gives me: 
"Subquery returned more than 1 value. This is not permitted when the 
subquery follows =, !=, <, <= , >, >= or when the subquery is used as an 
expression." 

Select MKey,Otherdata from M 
LEFT OUTER JOIN ON M.MKEY = 

(Select M_Code from 

(Select left(F.FUNKey, CHARINDEX ('/', F.FUNKey) -1) as M_Code 
,row_number() over (partition by left(F.FUNKey, CHARINDEX ('/', F.FUNKey) -1) 
order by left(F.FUNKey, CHARINDEX ('/', F.FUNKey) -1)) 

as rn 
from FUN F 
where F.BinaryData=1 
) tmp 

Where rn=1 
) 

是否有一個簡單的解決方案來使用SELECT的結果我錯過了一個連接,還是我試圖用零(再次)除?

環境是MS SQL 20012

回答

0

這是一個有點不清楚它是什麼,你要完成,但也許這是你在找什麼:

SELECT MKey, Otherdata 
FROM M 
LEFT OUTER JOIN (
    SELECT DISTINCT 
     LEFT(FUNKey, CHARINDEX ('/', FUNKey) -1) FUNKEY 
    , BinaryData 
    FROM FUN 
) F ON M.MKey = F.FUNKEY AND F.BinaryData = 1; 

這將返回:

MKey     Otherdata 
-------------------- -------------------- 
ABCD     kjjh 
EFGH     oioo 
IJKL     uhdjdhu 
MNOP     isdid 
QRST     lkuh 

如果您不想要最後一行(BinaryData = 0),則將連接條件中的AND更改爲WHERE。

+0

但在結果集中,他沒有針對QRST,lkuh @jpw – mohan111

+0

@Jonathan我意識到,這就是爲什麼我解決它在最後一句中。我認爲OP希望該行作爲原始查詢使用「左外連接」,否則「內連接」更合理。 – jpw

+0

我同意忘了看@ jpw – mohan111

0
declare @Table1 TABLE 
    ([MKey] varchar(4), [OtherData] varchar(7)) 
; 

INSERT INTO @Table1 
    ([MKey], [OtherData]) 
VALUES 
    ('ABCD', 'kjjh'), 
    ('EFGH', 'oioo'), 
    ('IJKL', 'uhdjdhu'), 
    ('MNOP', 'isdid'), 
    ('QRST', 'lkuh') 
; 
declare @Table2 TABLE 
    ([FUNKey] varchar(8), [BinaryField] int) 
; 

INSERT INTO @Table2 
    ([FUNKey], [BinaryField]) 
VALUES 
    ('ABCD/GGG', 1), 
    ('ABCD/KKK', 0), 
    ('ABCD/MMM', 1), 
    ('EFGH/ABC', 1), 
    ('IJKL/DDD', 1), 
    ('IJKL/VVV', 1), 
    ('IJKL/XXX', 0), 
    ('MNOP/AAA', 1), 
    ('NMOP/DEF', 1), 
    ('NMOP/FFF', 1), 
    ('QRST/SSS', 0) 

; 
;with CTE AS(
select A.MKey, 
     A.OtherData, 
     BinaryField, 
ROW_NUMBER()OVER(PARTITION BY OtherData ORDER BY (SELECT NULL))RN from (
Select MKey,Otherdata,BinaryField 
from @Table1 M 
     LEFT OUTER JOIN @Table2 FUN 
ON M.MKey = left(FUNKey, CHARINDEX ('/', FUNKey) -1) 
AND FUN.BinaryField=1)A) 
Select MKey, 
     OtherData 
from CTE 
where RN = 1 
AND BinaryField IS NOT NULL 
ORDER BY Mkey 
0

我想你們都使這種難度比它是

Select distinct M.MKey, M.Otherdata 
from M 
JOIN FUN 
    ON M.MKey = left(FUNKey, CHARINDEX ('/', FUNKey) -1) 
    AND FUN.BinaryData = 1