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中不受支持。