2016-06-29 12 views
-2

2つのテーブルを結合して1つの列をもう1つの列に戻す問題があります。内部結合が多すぎる行を返します

SELECT om.*, cm.Sales_Stage FROM dbo.OM_Table1 om JOIN dbo.Criteria_Matters cm ON cm.clientCorporationID = om.ClientCorporationID ORDER BY om.ClientCorporationID

は、私は私のCMテーブルからSales_Stageを含めたいが、参加原因代わりに参加せずに返されます〜7Kの14K +行を返すように結果セット。

クエリを吹き飛ばすことなくこの列を追加するだけですか?

+2

つまり、 'dbo.Criteria_Matters'テーブルに' clientCorporationID'ごとに複数の行があることを意味します。 – Lamak

+1

お手伝いします。テーブルの構造、サンプルデータ、そしてそのサンプルについて得たい結果を共有してください。 – Mureinik

+0

あなたの問題は、あなたが何かを引っ張っているということです。* ..... – logixologist

答えて

1

サブクエリを使用することができます。複数のエントリがClientCorporationIDにあるので、これは正しくsales_stageを選択できないことに注意してください。Criteria_Mattersサブクエリでorder byが必要な場合があります。

SELECT om.*, 
    (SELECT TOP 1 cm.Sales_Stage 
    FROM dbo.Criteria_Matters cm 
    WHERE cm.clientCorporationID = om.ClientCorporationID) AS Sales_Stage 
ORDER BY om.ClientCorporationID 

...私はom.*が例のためであったと仮定しています。プロダクションではそうしないのがベストプラクティスです。

あなたはこのような何かをしたい場合の違いではなく...

​​
+0

実際には、「これはsales_stage [the OP] want is [s]」を正しく選択していない可能性があります。実際には、書かれているように、余分な行が二重引用符でない限り、望ましい結果が得られると確信する方法はありません(SELECT DISTINCTが良い選択かもしれません)。したがって、それを答えとして提示する理由は不明です。 –

+0

合意しました...しかし、それは投稿された質問によって彼の意図ではないように見える彼のリストを拡大します。本当の答えは 'Criteria_Matters'のPKを追加することです。 –

+0

' SELECT distinct 'はコピー&ペーストエラーでした...私は 'distinct'を削除しました。 –

0

はちょうどあなたのテーブルの構造に関する情報がないことから推測するが、問題はその可能性がある参照することを意図している場合Criteria_Mattersテーブルには、指定されたclientCorporationIDのレコードが多数あります。したがって、一致するCriteria_Matters.ClientCorporationIDレコードの数に基づいて、OM_Table1のすべてのレコードを複製します。

これに対処する方法がいくつかあります.1つは、完全なCriteria_Mattersテーブルに参加する代わりにインラインビューを使用する方法です。

インラインビューとGROUP BY Criteria_Matters.ClientCorporationIDを追加すると、結合テーブルにClientCorporationIDごとに1つのレコードしか存在しないことが保証され、重複したレコードは取得されません。もちろん、clientCorporationIDでグループ化しているので、Sales_Stageに集約関数を適用する必要があります。 MAX(Sales_Stage)を選択するだけで、最大値が何であれ取得できます。 Sales_Stageが特定のclientCorporationIDごとに同じであることが分かっている場合は、すべて設定されています。 clientCorporationIDとSales_Stage両方であなたができるグループ -

SELECT om.*, cm.Sales_Stage 
FROM dbo.OM_Table1 om 
INNER JOIN 
(
    SELECT clientCorporationID, MAX(Sales_Stage) AS Sales_Stage 
    FROM dbo.Criteria_Matters 
    GROUP BY clientCorporationID 
) cm ON cm.clientCorporationID = om.ClientCorporationID 
ORDER BY om.ClientCorporationID 

しかし、与えられたclientCorporationIDに異なるSales_Stage値がCriteria_Mattersテーブルに存在する場合:SQLは、次のようになります。これを行うと、OM_Table1レコードが複製されますが、Criteria_MattersのClientCorporationIDに対応する一意のSales_Stageごとにのみレコードが複製されます。 SQLは次のようになります。

SELECT om.*, cm.Sales_Stage 
FROM dbo.OM_Table1 om 
INNER JOIN 
(
    SELECT clientCorporationID, Sales_Stage 
    FROM dbo.Criteria_Matters 
    GROUP BY clientCorporationID, Sales_Stage 
) cm ON cm.clientCorporationID = om.ClientCorporationID 
ORDER BY om.ClientCorporationID 

幸運を!