Sql 三表联接的选择性筛选
我有三张桌子表1、表2和表3 表1与表2有一对多关系。表2与表3有一对多关系 假设表1已经完成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
-------------
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;