2014-02-05 38 views
0

我試圖創建一個笛卡兒連接2臺,其中在一個表中的列充當從列表中排除某些游泳的標誌:笛卡爾加入對國家和游泳表,但不包括標有國家

Table 1: Country List 
Code Name 
-------------------------------- 
FR  France 
NE  Netherlands 
BE  Belgium 

這裏的第二個表:

Table 2: Swimmer List 
SwimmerName  FR NE BE 
-------------------------------- 
Swimmer1    N 
Swimmer2   N 
Swimmer3 

基本上,我需要做一個笛卡兒連接,但不包括在國家被標記爲N.記錄

預期結果:

Swimmer1 FR 
Swimmer1 BE 
Swimmer2 NE 
Swimmer2 BE 
Swimmer3 FR 
Swimmer3 NE 
Swimmer3 BE 

請注意,如果該國家已被標記爲N,則不包括在結果中。任何想法如何實現這一目標?

+0

您正在使用什麼'RDBMS'? – Milen

+0

MS Access Milen –

回答

2

如果我理解正確,國家縮寫是第二個表中的列名稱。要做到這一點不使用第一表的一種方法......你可以使用類似:

select SwimmerName, "FR" from SwimmerList where FR<>"N" 
union 
select SwimmerName, "NE" from SwimmerList where NE<>"N" 
union 
select SwimmerName, "BE" from SwimmerList where BE<>"N" 
+0

好點!我從來沒有考慮過我實際上不需要第一張桌子。 :)這對我實現我的目標有效。謝謝。 –

2

做的另一種方法是使用UNPIVOT UNPIVOT link在SwimmerList全國列。

下面是示例代碼:

-- set up sample data 
DECLARE @SwimmerList TABLE (SwimmerName NVARCHAR(10), FR CHAR, NE CHAR, BE CHAR) 
INSERT @SwimmerList(SwimmerName,FR,NE,BE) 
VALUES ('Swimmer1', '', 'N', ''), 
    ('Swimmer2', 'N', '', ''), 
    ('Swimmer3', '', '', '') 

-- unpivot 
SELECT 
    SwimmerName, CountryCode 
FROM 
    (SELECT SwimmerName, FR, NE, BE 
    FROM @SwimmerList) AS sl 
UNPIVOT 
    (CountryExists FOR CountryCode IN (FR, NE, BE)) AS unpvt 
WHERE CountryExists <> 'N' 

SQLFiddle:link

注意:此方法適用於SQL Server 2005或更高版本。

+0

不錯,我不知道UNPIVOT。 – wwkudu

+0

是的,我最近纔剛剛學會了它自己! –