2016-09-20 7 views
0

私のオフィスでは、2つの部門に所属するのは一般的な人です。クエリの場合、各人物が1つの部門にのみ関連付けられるように、クエリを制限したいと思います。戻ってくるフィールドに1つの戻り値を許可する

SELECT Last_Name, FIRST(Department), Date_of_Sale 
From column1, 
FROM column1 JOIN column2 ON column1.id=column2.id 
GROUP BY Last_Name 

ID | Last_Name | Department 
-------------------------------- 
1  Doe  Informatics 
2  Miller  Database Management 
2  Miller  Informatics 
3  Johnson Engineering 
4  Mitchell Database Management 
4  Mitchell Engineering 

table2の

ID | Date_of_sale 
-------------------------------- 
1  8-2-2012   
1  1-4-2003  
2  5-23-2000  
2  1-17-2003 
2  12-30-2001 
2  9-8-2013 
3  4-19-2013 
4  3-8-2015 
4  11-8-2013 
4  2-12-2007 

は、私のような何かをしたい

TABLE1:

は例えば、ここでは2つのHRテーブルです:

  Last_Name | Department |  Date_of_sale 
     ---------------------------------------- 
     Doe   Informatics   8-2-2012 
     Doe   Informatics   1-4-2003 
     Miller  Database Management 5-23-2000 
     Miller  Database Management 1-17-2003 
     Miller  Database Management 12-30-2001 
     Miller  Database Management 9-8-2013  
     Johnson  Engineering   4-19-2013 
     Mitchell Database Management 3-8-2015 
     Mitchell Database Management 11-8-2013 
     Mitchell Database Management 2-12-2007 

ここで、各個人には、1つの部門のみが関連付けられています。

+2

あなたは 'MySQL'または' SQL Server'を使用していますか?彼らは同じことではありません。 – Siyual

+0

あなたのRDBMSを知らなくても、重複が該当するかどうかは不明です。あなたの複製を見つけてそれにフラグを立ててください。 :)https://www.google.com/search?+ UTF-8&rlz = 1T4GGNI_enUS551US551&q =スタック+オーバーフロー+リターン+のみ+ 1 +値+ルックアップ+テーブル&gs_l = hp。 ... 0.0.5.303453 ............ 0.MXi4g7W_Gok#safe =アクティブ&q =スタック+オーバーフロー+ sql + join + only + one +行 –

+0

質問は何ですか?あなたの希望する出力は何ですか?コラム2はこの質問に何をしなければならないのですか? – kbball

答えて

1

あなたのRDBMSが特定の答えを出すのは簡単ではありません。ほとんどのシステムで中華鍋一般的な答えは、集約とネストされたSELECTを使用することです:

SELECT c1.ID, c1.Last_name, c1.Department, c2.Date_of_Sale 
FROM 
    (SELECT 
     ID 
     ,Last_name 
     ,MIN(Department) as Department 
    FROM 
     column1 
    GROUP BY 
     ID 
     ,Last_name) c1 
    INNER JOIN column2 c2 
    ON c1.ID = c2.ID 

次にSQL-SERVERと共通テーブル式とウィンドウ機能をサポートする他のほとんどのRDBMSにパーティション化さROW_NUMBERを(作成することができます)あなたは(CTEに注意しても代わりに選択ネストすることができます。

;WITH cte AS (
    SELECT 
     * 
     ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Department) as RowNumber 
    FROM 
     column1 
) 

SELECT 
    c1.Id 
    ,c1.Last_name 
    ,c1.Department 
    ,c2.Date_of_Sale 
FROM 
    cte c1 
    INNER JOIN column2 c2 
    ON c1.Id = c2.Id 
WHERE 
    c1.RowNumber = 1 

たいものを選択し、あなたが何らかの形であなたが返される部署にpresedenceを置く場合は、それを行うための一般的な方法であること、などの記録作成日...しかし、ウィンドウ関数がサポートされていて、分割されたMIN()またはMAX()を取得できる部門を本当に気にしない場合は、これは1つのselectステートメントのレコードの昇順になります。

SELECT DISTINCT 
    c1.ID 
    ,c1.Last_name 
    ,MIN(c1.Department) OVER (PARTITION BY c1.ID) as Department 
    ,c2.Date_of_Sale 
FROM 
    column1 c1 
    INNER JOIN column2 c2 
    ON c1.ID = c2.ID 
1

使用しているSQLの種類と各姓の部門を選択する方法によって、これを行うにはいくつかの方法があります。

ここでは、を使用したカップルの例を示します。

SELECT id, last_name, MIN(department) 
FROM column1 
GROUP BY id, last_name 

ここでテスト:

SELECT id, last_name, 
SUBSTRING_INDEX(GROUP_CONCAT(department), ',', 1) AS Department 
FROM column1 
GROUP BY id, last_name 
  • がアルファベット順部門を選択:

    1. 最初にリストされている部署を選択しhttp://sqlfiddle.com/#!9/67bf3/8

  • 1

    使用をス各ユーザーの最初の部門を取得し、2番目のテーブルに参加します。

    SELECT t1.Last_Name, 
         t1.Department, 
         t2.Date_of_Sale 
        FROM (select id, Last_Name, MIN(Department) Department from column1 group by id, Last_Name) t1 
        JOIN column2 t2 ON 
         t1.id = t2 .id 
    
    関連する問題