Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 三表联接的选择性筛选_Sql - Fatal编程技术网

Sql 三表联接的选择性筛选

Sql 三表联接的选择性筛选,sql,Sql,我有三张桌子表1、表2和表3 表1与表2有一对多关系。表2与表3有一对多关系 假设表1已经完成 ------------- t1key ------------- a b Table2 has ------------- t1key | t2key -------------- a c a d b x b y Table 3 ------------ t2key | t3key ------------- c e c

我有三张桌子表1、表2和表3

表1与表2有一对多关系。表2与表3有一对多关系

假设表1已经完成

-------------
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
我希望连接这三个表,以便只返回表3中t2key的第一个唯一匹配项

join的结果应该是

a c  e
a d  h
b x  m
b y  p
目前,我的应用程序连接了所有三个表,返回所有可能的行。我需要用上面的条件过滤掉这个

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
像这样:

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;
这将为您提供:

| T1KEY | T2KEY | T3KEY |
-------------------------
|     a |     c |     e |
|     a |     d |     h |
|     b |     x |     m |
|     b |     y |     p |

首先需要使用
groupby
子句并使用
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;
如果只想显示每个表中可用的数据,请使用
内部联接
而不是
左联接

e、 g.假设在
表2中有一行
'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 |
| T1KEY | T2KEY | T3KEY|
--------------------------
|a | c | e|
|a | d | h|

|请注意格式。更好的方法是,编写一个模式(
createtable
和一些
inserttable
语句)或在上提供一个表示例。如果我们无法正确查看数据,很难回答SQL问题。请告诉我们是哪种RDBMS?@user1971858您检查过我的逻辑了吗
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
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;