SQL复杂查询三个字段

时间:2014-12-16 18:50:59

标签: sql teradata

我有一个具有这种结构的表:

Field A  Field B  Field C
a1       b1       t1
a1       b1       t2
a2       b1       t1
a2       b1       t2

字段A和字段B是相关的,对于给定的b *,有几个a *。

我需要列出满足以下条件的字段A或字段B:

  • b *有几个a *
  • a *有1到N t *
  • 如果属于同一个b *的两个a *具有不同的t *,那么我需要列出a *或其父b *

在前面的例子中,没有列出任何内容,因为b1有a1和a2,a1和a2都有相同的信息:它们都有t1和t2。

在下一个例子中,我需要检测属于b1的a1和a2有不同的信息(a1:t1和t2; b1:只有t1,它没有t2)。

Field A  Field B  Field C
a1       b1       t1
a1       b1       t2
a2       b1       t1
a3       b2       t3

查询将显示a1,a2或b1。

我知道这很复杂,但我需要获取这些信息。

谢谢!

1 个答案:

答案 0 :(得分:0)

您实际上需要添加解释,说明为什么第一个示例中没有任何内容返回到需求。

示例1的解决方案:

SELECT
t.B,
GROUP_CONCAT(DISTINCT t.A)
FROM
t
INNER JOIN (
  SELECT
  B,
  A
  FROM
  t
  GROUP BY B, A
  HAVING
  COUNT(DISTINCT C) > 1
) q ON t.A = q.A AND t.B = q.B /* a* has 1 to N t* */

WHERE t.B IN (
  SELECT sq.B FROM (
    SELECT st.B, GROUP_CONCAT(st.C ORDER BY st.C) AS gcc FROM t AS st GROUP BY st.B, st.A
  ) sq GROUP BY sq.B HAVING COUNT(DISTINCT gcc) > 1
) /* if two a* belonging to the same b* have different t*, then I need to list that a* or its parent b* */

GROUP BY t.B
HAVING
COUNT(DISTINCT t.A) > 1 /* b* has several a* */
;
  • 如果你想在这个sqlfiddle
  • 中玩弄它

你的第二个例子对我来说并不清楚。但我想你的意思是:

SELECT
B, A
FROM
t
WHERE A IN ('a1', 'a2')
GROUP BY B, A
HAVING 
COUNT(DISTINCT C) > 1
OR 
COUNT(*) = 1;
相关问题