1

我有 n 个表都具有相同的字段:UsernameValue. 同一个用户名可以在每个表上有多个寄存器,但每个表的组合Username/Value都是唯一的。

我想将这些表连接成一个表,其中包含出现在所有表上的所有用户,并具有所有不同的(用户名/值)对。

例子

  • 表 A:{(User1,Value1);(User1,Value2);(User2,Value2);(User3,Value4)]

  • 表 B:{(User1,Value4);(User3,Value5)]

  • 表 C:{(User1,Value5);(User1,Value2);(User2,Value7);(User3,Value8)]

期望的输出

Table D: {(User1,Value1);(User1,Value2);(User1,Value4);(User1,Value5);(User3,Value4);(User3,Value5);(User3,Value8)}

现在我正在做这样的多个连接(使用 perl)

SELECT * 
INTO $target_table 
FROM (SELECT *  
      FROM $table1 
      WHERE bname IN (SELECT DISTINCT bname FROM $table2) 
      UNION
      SELECT * 
      FROM $table2 
      WHERE bname IN (SELECT DISTINCT bname FROM $table1)
     ) UN

然后在第三个表之间进行相同的连接target_table,依此类推,但我认为这应该是一种更好的方法。

有什么提示吗?

4

2 回答 2

2

您可以UNION为此使用:

SELECT username, value
FROM $table1
UNION
SELECT username, value
FROM $table2
...
SELECT username, value
FROM $tablex

这将为您返回不同的记录。如果您对重复项感兴趣,请使用UNION ALL.


鉴于您的编辑,如果用户在所有表中,您似乎只想返回记录。

打破它,你需要做一些事情。首先,再次将所有记录组合在一起,但这一次表示每个记录来自哪个表。然后,您需要知道每个用户所在的表数。最后,您需要检查该数字与表的总数。

这是使用一些 CTE 的一种方法:

WITH CTE AS (
  SELECT username, value, 1 AS tbl
  FROM t1
  UNION
  SELECT username, value, 2 AS tbl
  FROM t2
  UNION
  SELECT username, value, 3 AS tbl
  FROM t3
  ),
CTECnt AS (
  SELECT username, COUNT(DISTINCT tbl) tblCnt
  FROM CTE
  GROUP BY username
  ),
CTEMaxCnt AS (
  SELECT COUNT(DISTINCT tbl) MaxCnt
  FROM CTE
  )
SELECT C.username, C.value
FROM CTE C
  JOIN CTECnt C2 ON C.username = C2.username
  JOIN CTEMaxCnt C3 ON C2.tblCnt = C3.MaxCnt
于 2013-05-30T22:21:16.207 回答
1
With Combined As
  (
    Select 'A' As TableName, Username, Value
    From TableA
    Union All
    Select 'B', Username, Value
    From TableB
    Union All
    Select 'C', Username, Value
    From TableC
    )
Select C.Username, C.Value
From Combined As C
    Join (
          Select C1.Username
          From Combined As C1
          Group By C1.Username
          Having Count(Distinct C1.TableName) = 3
          ) As Z
      On Z.Username = C.Username
Group By C.Username, C.Value

SQL 小提琴版本

于 2013-05-31T05:48:52.120 回答