【问题标题】:Create a UNION query that identifies which table the unique data came from创建一个 UNION 查询,用于标识唯一数据来自哪个表
【发布时间】:2013-10-25 13:58:55
【问题描述】:

我有两个数据表。这两个表都有一个CUSTOMER_ID 列(它是数字)。我正在尝试获取CUSTOMER_ID 的所有唯一值的列表并且知道CUSTOMER_ID 是否存在于两个表中或仅存在于一个表中(以及哪一个)。

我可以轻松获得唯一CUSTOMER_ID的列表:

SELECT tblOne.CUSTOMER_ID
FROM tblOne.CUSTOMER_ID
UNION
SELECT tblTwo.CUSTOMER_ID
FROM tblTwo.CUSTOMER_ID

我不能只在SELECT statemtn 中添加一个标识符列(例如:SELECT tblOne.CUSTOMER_ID, "Table1" AS DataSource),因为这样记录就不会是唯一的,它会同时获取两组数据。

我觉得我需要在此查询中的其他位置添加它,但不确定如何。

为清楚起见进行编辑:

对于联合查询输出,我需要一个额外的列,它可以告诉我我看到的唯一值是否存在于:(1) 两个 表、(2) 表一或 (3)表二。

【问题讨论】:

  • 访问是否支持派生表? select * from (子查询代码) x
  • 问题是“和哪一个”这句话......这增加了难度:)
  • @Apostolos - 是的,我需要为此添加的DataSource 列提供三个可能的值:'both'、'tblOne'、'tblTwo'。或者它可能是 BLANK,然后是 'tblOne' 和 'tblTwo'。我只需要知道两者中都有哪些 CUSTOMER_ID,如果没有,它们在哪里。
  • 没关系我删除了我的答案,因为我使用了完全外连接,ms-access 不支持

标签: sql ms-access unique union


【解决方案1】:

如果 CUSTOMER_ID 出现在两个表中,那么我们将不得不任意选择哪个表来调用源。在这种情况下,以下查询使用“tblOne”作为 [SourceTable]:

SELECT
    CUSTOMER_ID,
    MIN(Source) AS SourceTable,
    COUNT(*) AS TableCount
FROM
    (
        SELECT DISTINCT
            CUSTOMER_ID, 
            "tblOne" AS Source
        FROM tblOne
    UNION ALL
        SELECT DISTINCT
            CUSTOMER_ID,
            "tblTwo" AS Source
        FROM tblTwo
    )
GROUP BY CUSTOMER_ID

【讨论】:

  • 子查询需要一个别名。希望访问支持这种结构。
  • @Dan 是的,该查询在 Access 中有效。我在发布之前对其进行了测试。
  • @thornomad 如果 CUSTOMER_ID 出现在两个表中,则 [TableCount] 将为 2,否则为 1。
  • @thornomad 不客气。顺便说一句,我通过将 DISTINCT 添加到子查询组件来稍微调整查询。即使两个表中的任何一个中存在重复的 CUSTOMER_ID 值,这也将确保结果一致。
  • @BKSpureon 不,它将读取 'tblOne' 或 'tblTwo' 因为子查询中的 Source 列是文本。
【解决方案2】:

戈德汤普森的回答是正确的。但是,没有必要在子查询中做一个 distinct。而且,您可以返回包含您要查找的信息的单列:

select customer_id,
       iif(min(which) = max(which), min(which), "both") as DataSource
from (select customer_id, "tblone" as which
      from tblOne
      UNION ALL
      select customer_id, "tbltwo" as which
      from tblTwo
     ) t
group by customer_id

【讨论】:

  • 是的,子查询中的 DISTINCT 不是绝对必要的。但是,正如我在 cmets 中对我的回答所指出的那样,我添加了它们以防两个表中存在重复的 CUSTOMER_ID 值。具体来说,[tblOne] 中有两个这样的值而 [tblTwo] 中没有这样的值会产生误导性的结果:看起来 CUSTOMER_ID 似乎出现在两个表中,而实际上并没有出现。顺便说一句,与IIf(Min()=Max()... 的接触很好。
  • @GordThompson 。 . .在您的查询版本中,您需要distinct,因为您在外部查询中使用count(*)。如果您在外部查询中使用了count(distinct),那么这不是问题。
  • count(distinct) 在 Access SQL 中不受支持。
【解决方案3】:

我们可以添加一个整数数据类型的标识符列,然后进行外部查询:

SELECT 
CUSTOMER_ID,
sum(Table)

FROM 
(
SELECT 
  DISTINCT CUSTOMER_ID, 
  1 AS Table
FROM tblOne
UNION
SELECT 
  DISTINCT CUSTOMER_ID,
  2 AS Table
FROM tblTwo
)
GROUP BY CUSTOMER_ID` 

所以如果“总和为 1”,那么它来自 tablOne,如果它是 2,那么它来自 tableTwo,如果它是 3,那么它存在于两者中

如果你想在联合中添加第三个表,那么给它一个值 4,这样你应该为每个组合都有一个唯一的总和

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2014-09-02
    相关资源
    最近更新 更多