2016-05-23 7 views
0

2つのテーブルから結果を取得する必要がある状況があります。表Aには「MEMBERS」、表Bには「MEMBERUDFS」という名前が付けられています。 'MEMBERS'のすべての行に 'MEMBERUDFS'というエントリがあるわけではないので、テーブルにLEFT JOINが必要です。私はMEMBERUDFSのエントリのすべてがこのクエリに関連しているわけではない、 'MEMBERUDFS'から基準と一致する 'MEMBERS'から行を引き出す必要があります。ここで私は同じヘルプが必要です。私の現在のクエリは、MEMBERSテーブルのすべてのフィールドとMEMBERUDFSの対応する行を返すため、各メンバに複数の行が返されます。私がしたいのは、MEMBERSデータと同じ行に返されたMEMBERUDFSテーブルのフィールドを持つことです。例えば、私が取得:SQLロジック - 2つのテーブル、テーブル2の複数の行

lastname firstname relationship email    entrydate scancode sitename udflabel udfvalue expr1 expr2 
doe  jane  p    [email protected] 1/1/2016 1234  Home  Guest Pass Yes  steve holmes 
doe  jane  p    [email protected] 1/1/2016 1234  Home  Pass Used No   steve holmes 
doe  jane  p    [email protected] 1/1/2016 1234  Home  Visited yes  steve holmes 
私が探しています何

はこれです:以下

doe jane p [email protected] 1/1/2016 1234 Guest Pass Yes steve holmes  Pass Used  No  Visited  yes 

私のクエリです:

SELECT MEMBERS.lname, MEMBERS.fname, MEMBERS.relationship, MEMBERS.email, MEMBERS.entrydate, 
     MEMBERS.scancode, MEMBERS.siteid, SITES.sitename, 
     MEMBERUDFSETUPS.udflabel, MEMBERUDFS.udfvalue, EMPLOYEES.lname AS Expr1, 
     EMPLOYEES.fname AS Expr2 
FROM MEMBERS 
    LEFT OUTER JOIN MEMBERUDFS ON MEMBERS.memid = MEMBERUDFS.memid 
    INNER JOIN MEMBERUDFSETUPS ON MEMBERUDFS.udfid = MEMBERUDFSETUPS.udfid 
    INNER JOIN SITES ON MEMBERS.siteid = SITES.siteid 
    INNER JOIN EMPLOYEES ON MEMBERS.employeeid = EMPLOYEES.employeeid 
WHERE (MEMBERS.relationship = 'P') 
    AND (MEMBERS.siteid = @rvSite) 
    AND (MEMBERUDFS.udfid = '25' OR 
     MEMBERUDFS.udfid = '26' OR 
     MEMBERUDFS.udfid = '27') 
    AND (MEMBERS.entrydate BETWEEN @entryDateStart AND @entryDateEnd) 
ORDER BY MEMBERS.entrydate DESC 
+1

真の左結合動作を取得する場合は、MEMBERUDFS.udfid条件を 'WHERE'節から' ON'節に移動します。 (これは今では定期的な内部結合の結果を得ています) – jarlh

+1

これまでのところ、結合の仕組みが分かっている限り、余分な列の名前はどのように指定しますか?各メンバーが関連するUDFの量が異なる場合はどうなりますか? – ArturoAP

+0

どのRDBMSを使用していますか? –

答えて

0

あなたが取ることができる2つの方法があります。一番簡単なのは、MEMBERUDFSテーブルに複数回ジョインすることです。これは、取得しようとしている各udfidに対して1回です。簡単なサンプルコードは以下の通りです。あなたのudfidが一致している場合には(常に同じラベルを持っている)、

SELECT 
    MEMBERS.lname 
    ,MEMBERS.fname 
    ,MEMBERS.relationship 
    ,MEMBERS.email 
    ,MEMBERS.entrydate 
    ,MEMBERS.scancode 
    ,MEMBERS.siteid 
    ,SITES.sitename 
    ,MUS_25.udflabel 
    ,MU_25.udfvalue 
    ,MUS_26.udflabel 
    ,MU_26.udfvalue 
    ,MUS_27.udflabel 
    ,MU_27.udfvalue 
    ,EMPLOYEES.lname AS Expr1 
    ,EMPLOYEES.fname AS Expr2 
FROM 
    MEMBERS 
    LEFT OUTER JOIN MEMBERUDFS MU_25 
     ON MEMBERS.memid = MU_25.memid AND 
      MU_25.udfid = '25' 
    LEFT OUTER JOIN MEMBERUDFSETUPS MUS_25 
     ON MU_25.udfid = MUS_25.udfid 
    LEFT OUTER JOIN MEMBERUDFS MU_26 
     ON MEMBERS.memid = MU_26.memid AND 
      MU_26.udfid = '26' 
    LEFT OUTER JOIN MEMBERUDFSETUPS MUS_26 
     ON MU_26.udfid = MUS_26.udfid 
    LEFT OUTER JOIN MEMBERUDFS MU_27 
     ON MEMBERS.memid = MU_27.memid AND 
      MU_27.udfid = '27' 
    LEFT OUTER JOIN MEMBERUDFSETUPS MUS_27 
     ON MU_27.udfid = MUS_27.udfid 
    INNER JOIN SITES 
     ON MEMBERS.siteid = SITES.siteid 
    INNER JOIN EMPLOYEES 
     ON MEMBERS.employeeid = EMPLOYEES.employeeid 
WHERE 
    (MEMBERS.relationship = 'P') AND 
    (MEMBERS.siteid = @rvSite) AND 
    (MEMBERS.entrydate BETWEEN @entryDateStart AND @entryDateEnd) 
ORDER BY 
    MEMBERS.entrydate DESC 

注意、あなたは、単に適切なラベルを持つ各udfvalueはできエイリアス:

SELECT 
    MEMBERS.lname 
    ,MEMBERS.fname 
    ,MEMBERS.relationship 
    ,MEMBERS.email 
    ,MEMBERS.entrydate 
    ,MEMBERS.scancode 
    ,MEMBERS.siteid 
    ,SITES.sitename 
    ,MU_25.udfvalue AS Guest_Pass 
    ,MU_26.udfvalue AS Pass_Used 
    ,MU_27.udfvalue AS Visited 
    ,EMPLOYEES.lname AS Expr1 
    ,EMPLOYEES.fname AS Expr2 
FROM 
    MEMBERS 
    LEFT OUTER JOIN MEMBERUDFS MU_25 
     ON MEMBERS.memid = MU_25.memid AND 
      MU_25.udfid = '25' 
    LEFT OUTER JOIN MEMBERUDFS MU_26 
     ON MEMBERS.memid = MU_26.memid AND 
      MU_26.udfid = '26' 
    LEFT OUTER JOIN MEMBERUDFS MU_27 
     ON MEMBERS.memid = MU_27.memid AND 
      MU_27.udfid = '27' 
    INNER JOIN SITES 
     ON MEMBERS.siteid = SITES.siteid 
    INNER JOIN EMPLOYEES 
     ON MEMBERS.employeeid = EMPLOYEES.employeeid 
WHERE 
    (MEMBERS.relationship = 'P') AND 
    (MEMBERS.siteid = @rvSite) AND 
    (MEMBERS.entrydate BETWEEN @entryDateStart AND @entryDateEnd) 
ORDER BY 
    MEMBERS.entrydate DESC 
0

何がやりたいことが多いと呼ばれていますピボット:行を列に変換する。それはcaseステートメントで行われます。

select lname, fname 
     , max(case udfid when 25 then 'foo' end) as col1 
     , max(case udfid when 26 then 'foo' end) as col2 
from MEMBERS left join MEMBERUDFS 
... 
group by lname, fname 

DBMSによって

を行うことができます PIVOTオペレータを持って、あなたはUDFSテーブルの明確な説明を与えていないとあなたはそれがレイアウトされたいか、私はあなたにそれについて移動する方法のアイデアを与えることができますクエリーの実行は少し冗長で効率的です。例を検索する場合は、一緒に説明された「折り畳み」と「ピボット」を見つける必要があります。

関連する問題