0

Table1、Table2、Table3 の 3 つのテーブルがあります。

Table1 は Table2 と 1 対多の関係にあります。Table2 は Table3 と 1 対多の関係にあります。

table1が持っているとしましょう

-------------
t1key
-------------
a
b

Table2 has 
-------------
t1key | t2key
--------------
a        c
a        d
b        x
b        y


Table 3
------------
t2key | t3key
-------------
c      e
c      f
c      g
d      h
d      i
d      j
x      m
x      n
x      o
y      p
y      q
y      r

table3 の t2key の最初の一意の一致のみを返すように、3 つのテーブルを結合したい

結合の結果は

a c  e
a d  h
b x  m
b y  p

現在、私のアプリは 3 つのテーブルすべてを結合して、可能なすべての行を返します。上記の条件でこれを除外する必要があります。

SELECT * FROM Table1 AS T1  
LEFT OUTER JOIN Table2 T2 ON T1.t1Key = T2.t1Key 
LEFT OUTER JOIN Table2 T3 ON T2.t2Key = T3.t2Key
4

4 に答える 4

0

最初にGROUP BY句と使用を使用する必要がありますMIN()

SELECT t2.t1key, t2.t2key, MIN(t3.t3key) AS t3key
FROM Table1 AS T1  
LEFT JOIN Table2 T2 ON T1.t1Key = T2.t1Key 
LEFT JOIN Table3 T3 ON T2.t2Key = T3.t2Key
GROUP BY t2.t1Key, t2.t2key;

このSQLFiddleを参照してください

すべてのテーブルで利用可能なデータのみを表示する場合は、INNER JOIN代わりに を使用しLEFT JOINます。
たとえば、 に行があるとしTable2 'b', 'q'ます。
次に、使用LEFT JOINすると、次のような結果が表示されます

| T1KEY | T2KEY |  T3KEY |
--------------------------
|     a |     c |      e |
|     a |     d |      h |
|     b |     q | (null) | <-- It will show null value too
|     b |     x |      m |
|     b |     y |      p |

デモ

それを使用INNER JOINすると、そのレコードは表示されません

デモ

于 2013-01-12T06:16:34.353 に答える
0

このような:

SELECT 
  t2.t1Key, 
  t2.t2key, 
  MIN(t3.t3key) t3key
FROM Table1 AS T1  
INNER JOIN Table2 T2 ON T1.t1Key = T2.t1Key 
INNER JOIN Table3 T3 ON T2.t2Key = T3.t2Key
GROUP BY t2.t1Key, 
         t2.t2key;

SQL フィドルのデモ

これにより、次のことが得られます。

| T1KEY | T2KEY | T3KEY |
-------------------------
|     a |     c |     e |
|     a |     d |     h |
|     b |     x |     m |
|     b |     y |     p |
于 2013-01-12T06:14:01.970 に答える
0
DECLARE @table1 table
(
    t1 char(1)
)
INSERT INTO @table1
SELECT 'a' UNION ALL
SELECT 'b' 


DECLARE @table2 table
(
    t1 char(1),
    t2 char(1)
)
INSERT INTO @table2
SELECT 'a', 'c' UNION ALL
SELECT 'a', 'd' UNION ALL
SELECT 'b', 'x' UNION ALL
SELECT 'b', 'y' 

DECLARE @table3 table
(
    t1 char(1),
    t2 char(1)
)
INSERT INTO @table3
SELECT 'c', 'e' UNION ALL
SELECT 'c', 'f' UNION ALL
SELECT 'c', 'g' UNION ALL

SELECT 'd', 'h' UNION ALL
SELECT 'd', 'i' UNION ALL
SELECT 'd', 'j' UNION ALL

SELECT 'x', 'm' UNION ALL
SELECT 'x', 'n' UNION ALL
SELECT 'x', 'o' UNION ALL

SELECT 'y', 'p' UNION ALL
SELECT 'y', 'q' UNION ALL
SELECT 'y', 'r' 



SELECT 

    t1.t1,
    t2.t2,
    min(t3.t2)
FROM @table2 t2
INNER JOIN @table3 t3
ON t3.t1 = t2.t2
INNER JOIN @table1 t1
ON t1.t1 = t2.t1
GROUP BY t1.t1,
    t2.t2
于 2013-01-12T06:43:22.353 に答える
0
SELECT t1.t1key,t2.t2key,t3.t3key 
FROM Table1 t1  
INNER JOIN Table2 t2 ON t1.t1Key = t2.t1Key 
LEFT OUTER JOIN Table2 t3 ON t2.t2Key = t3.t2Key
group by t2.t1key,t2.t2key;
于 2013-01-12T07:32:48.220 に答える