3

2 つのテーブルに参加する必要があります

tableA
----------
colA   colB
A      1
B      2
C      3
D      4

tableB
----------
colC  ColD ColE...
A     A    X
A     B    X
A     C    X
B     A    Y
B     B    Y
B     C    Y

以前は、次のようにテーブルに参加していました。

SELECT *
FROM tableA a
JOIN tableB b
ON b.ColC =                  --This column SHOULD NORMALLY be a unique key column
    (SELECT TOP 1 tempB.ColC
     FROM tableB tempB
     WHERE a.ColA = tempB.ColC
     AND ...(other requirements here)
    )

ただし、このインスタンスには単一の一意の列がないため、ここでは機能しません。

編集: 必要な出力は、他の場所で使用するために table2 の columnE の値を取得するための 1 対 1 の結合です。

再度編集: 望ましい出力 -

ColA ColB ColC ColE ColD
A    1    A    X    any value of a,b,c (doesn't matter)
B    2    B    Y    any value of a,b,c
4

3 に答える 3

3

SQL は「関係ありません」1を行いません。ウィンドウ関数をサポートするデータベース システムを使用していると仮定すると、次のように動作するはずです。

SELECT *
FROM tableA a
JOIN (select *,ROW_NUMBER() OVER (PARTITION BY ColC ORDER BY ColD) as rn
      from tableB) b
ON b.ColC = a.ColC and
   b.rn = 1

この例では、選択する行は、ソート順が最も早い行であると判断しましたColD

1つまり、何を選択するかを気にしなくても、を選択するかを SQL に指定する必要があります。実際に気にしない場合は、まだあいまいなままにしてオプティマイザーに余裕を与える条件 (@Martin Smith によって提案されたものなど) を選択することもできますが、それでも仕様を提供する必要があります。

于 2013-07-17T06:50:20.050 に答える
2
select a.colA,a.colB,b.ColC,b.ColE,b.ColD
from tableA a
inner join (select ColC,max(ColD) as ColD,max(ColE) ColE 
            from tableB
            group by colC)b
on a.colA=b.colC

SQL フィドル

于 2013-07-17T06:48:44.170 に答える
1

GROUP BYサブクエリで使用できますまたはROW_NUMBER()(RDBMSを指定していませんが、TOP 1に基づいてSQL Serverを推測しています)

Group Byバージョン:

;WITH CTE_Group AS
(
  SELECT colC, MIN(ColE) ColE FROM TableB
  GROUP BY colC
)
SELECT a.ColA, a.ColB, b.ColE 
FROM TableA a
LEFT JOIN CTE_Group b on a.ColA = b.ColC;

Row_Number()バージョン:

;WITH CTE_RN AS
(
  SELECT *, ROW_NUMBER() OVER(PARTITION BY ColC ORDER BY ColD) RN
  FROM TableB
)
SELECT a.ColA, a.ColB, b.ColE 
FROM TableA a
LEFT JOIN CTE_RN b on a.ColA = b.ColC AND b.RN = 1;

SQLFiddle デモ

于 2013-07-17T06:48:47.043 に答える