当前位置: 首页 > 知识库问答 >
问题:

三表连接的选择性滤波器

从智志
2023-03-14

我有三张桌子表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

共有3个答案

丰景同
2023-03-14
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
方谦
2023-03-14

首先需要使用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;

如果只想显示每个表中可用的数据,请使用内部连接,而不是左连接<例如,假设表2中有一行“b”、“q”
如果使用左连接,则结果如下所示

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

使用内部连接将不会显示该记录

汪阿苏
2023-03-14

这样地:

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 |
 类似资料:
  • Cassandra 2.1,Spark 1.1,Spark-Cassandra-Connector 1.1

  • 我有三张桌子 表A 我需要根据传递的参数将TableA连接到TableB或TableC。ie 我尝试了以下查询 但是,这是给语法错误。有人能帮忙吗? 解决方案:

  • 免责声明:我的问题有点类似于这个问题和这个问题,但我已经尝试了这些帖子中建议的所有答案,并且已经花了几天时间来解决这个问题。 我在我现有的应用程序(JSP,仅限Servlet)中引入了Spring Security 3.2.6,并且我正在使用Java配置。我的应用程序将被浏览器和非浏览器客户端使用。我希望所有浏览器对网址的请求(即<代码>/网页/webVersion/和<代码>/网页/webVer

  • 我使用Wordpress表填充javafx TableView。在WP db中,我有两个表wp_posts和wp_postmeta,我需要通过ID连接表(wp_postmeta中的post_id),并从wp_postmeta中选择特定的行(不是全部)。 例如:wp_postmeta结构post_id,meta_key,meta_value。在meta_key中有3行-_YOAST_WPSEO_TI

  • 如果我有三个表: > 列出所有未被查看的正确方法是什么?此查询是否正确? 按< code>user_id列出所有< code >帖子及其“查看状态”如何? 您是否也可以推荐一个很棒的(用户友好的、非极客的)资源来提高我对LEFT JOIN、CROSS JOIN和(正常连接?从帖子、视图中选择*)的理解? 谢谢大家!

  • 我有一个代码就像 到目前为止,我还有各种其他方法,它们与上面的方法相同,只是过滤器不同。有些方法具有附加过滤器,有些方法具有不同的过滤器或没有过滤器。 我是否可能创建条件所需的过滤器集合并动态传递。并且集合中的所有过滤器都应用于流。我不想硬编码正在应用的过滤器列表。我想让它基于配置。我如何做到这一点?