Sql 创建一个联合查询,该查询标识唯一数据来自哪个表

Sql 创建一个联合查询,该查询标识唯一数据来自哪个表,sql,ms-access,unique,union,Sql,Ms Access,Unique,Union,我有两个数据表。两个表都有一个CUSTOMER\u ID列(数字)。我试图获得CUSTOMER\u ID的所有唯一值的列表,并知道CUSTOMER\u ID是否存在于两个表中,还是仅存在于一个表中(以及哪个表) 我可以很容易地获得唯一的客户ID的列表: SELECT tblOne.CUSTOMER_ID FROM tblOne.CUSTOMER_ID UNION SELECT tblTwo.CUSTOMER_ID FROM tblTwo.CUSTOMER_ID 我不能只在SELECTstate

我有两个数据表。两个表都有一个
CUSTOMER\u ID
列(数字)。我试图获得
CUSTOMER\u ID
的所有唯一值的列表,并知道
CUSTOMER\u ID
是否存在于两个表中,还是仅存在于一个表中(以及哪个表)

我可以很容易地获得唯一的
客户ID的列表

SELECT tblOne.CUSTOMER_ID
FROM tblOne.CUSTOMER_ID
UNION
SELECT tblTwo.CUSTOMER_ID
FROM tblTwo.CUSTOMER_ID
我不能只在
SELECT
statemtn中添加一个标识符列(比如:
SELECT tblOne.CUSTOMER\u ID,“Table1”作为数据源
),因为这样记录就不会是唯一的,它将获得两组数据

我觉得我需要在这个查询中的其他地方添加它,但不确定如何添加

为清晰起见,请编辑:
对于联合查询输出,我需要一个额外的列,它可以告诉我我看到的唯一值是否存在于:(1)两个表,(2)表1或(3)表2中。

如果客户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

戈德·汤普森的回答是正确的。但是,不必在子查询中执行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

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

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”,那么它来自表1,如果它是2,那么它来自表2,如果它是3,那么它存在于两者中


如果要在联合中添加第三个表,请将其值设为4,这样每个组合都应有一个唯一的和

access是否支持派生表?选择*从(子查询代码)X问题是“和哪一个”短语。。。这增加了难度:)@Apostolos-是的,我需要为这个添加的
DataSource
列提供三个可能的值:“两者”、“tblOne”、“tblTwo”。或者它可以是空的,然后是“tblOne”和“tblTwo”。我只需要知道哪个CUSTOMER_ID在VS中,如果不是,它们在哪里。无论如何,我删除了我的答案,因为我使用了ms Access中不支持的完全外部联接子查询需要别名。希望access支持此构造。@是的,该查询在access中工作。我在发布之前对其进行了测试。@thornomad如果两个表中都显示了客户ID,[TableCount]将为2,否则将为1。@thornomad不客气。顺便说一句,我通过在子查询组件中添加DISTINCT稍微调整了查询。这将确保即使两个表中有重复的CUSTOMER_ID值,结果也是一致的。@BKSpurgeon否,它将读取“tblOne”或“tblTwo”,因为子查询中的
Source
列是文本。是的,子查询中的DISTINCT不是绝对必要的。但是,正如我在回答的评论中所指出的,我添加了它们,以防两个表中都有重复的CUSTOMER_ID值。具体来说,[tblOne]中有两个这样的值,[tblTwo]中没有这样的值会产生误导性的结果:看起来两个表中都出现了CUSTOMER_ID,但实际上没有。顺便说一句,在您的查询版本中,
IIf(Min()=Max()…
@GordThompson…很好地使用了
distinct
,因为您在外部查询中使用了
count(*)
。如果您在外部查询中使用了
count(distinct)
,那么就不会有问题。
count(distinct)
在Access SQL中不受支持。