我如何从一个 table select *唯一* MS Access SQL 代码中重复?
How do I select *unique* duplicates in MS Access SQL code from one table?
我正在尝试使用 SQL 到 select 唯一重复的服务日期,其所有记录都包含在一个 table 中。这是一个从 table:
开始的示例
GroupID
ServiceID
ServiceDate
A
X
1/1/2010
A
Y
1/1/2010
A
Z
10/1/2010
我已经想出如何找到 2 条具有相同日期的不同记录并将它们排成一行,但我最终得到了一些重复的 table,因为它正在将每条记录与所有其他记录进行比较:
GroupID
ServiceID1
ServiceDate1
ServiceID2
ServiceDate2
A
X
1/1/2010
Y
1/1/2010
A
Y
1/1/2010
X
1/1/2010
我不想要最后一行,因为它本质上是第一行的副本。
关于如何摆脱第二行的任何想法?
这是一些复制代码(这是我的 SQL Fiddle:http://sqlfiddle.com/#!9/537d84)
CREATE TABLE MyTable (
GroupID varchar(255),
ServiceID varchar(255),
ServiceDate Date
);
INSERT INTO MyTable (GroupID, ServiceID, ServiceDate)
VALUES ("A", "X", '2010-01-01'),
("A", "Y", '2010-01-01'),
("A", "Z", '2010-10-01');
SELECT DISTINCT
c1.ServiceID AS ServiceID1, c1.ServiceDate AS ServiceDate1,
c2.ServiceID AS ServiceID2, c2.ServiceDate AS ServiceDate2
FROM MyTable c1 INNER JOIN MyTable c2
ON c1.GroupID = c2.GroupID
WHERE (c1.ServiceID <> c2.ServiceID AND c1.ServiceDate = c2.ServiceDate);
注意:我认为我可以创建 A-B 和 B-A 组合 ID 变量,然后对它们 SELECT DISTINCT。不幸的是,这是 SQL 的一个比 MS Access 功能稍差的版本(技术上,我使用 Microsoft.ACE.OLEDB.12.0 连接字符串在 VBA 中编写它),所以有没有 CONCAT 函数,也没有 CASE WHEN 子句,语法效率方面存在其他缺陷。
关于如何摆脱第二行的任何想法?
由于您使用的是 <>
条件,因此您总是会得到重复的结果(x-y 和 y-x)。您可以任意决定较小的 ServiceId
应该始终位于 c1
:
中,而不是使用 <>
SELECT DISTINCT
c1.ServiceID AS ServiceID1, c1.ServiceDate AS ServiceDate1,
c2.ServiceID AS ServiceID2, c2.ServiceDate AS ServiceDate2
FROM MyTable c1 INNER JOIN MyTable c2
ON c1.GroupID = c2.GroupID
WHERE (c1.ServiceID < c2.ServiceID AND c1.ServiceDate = c2.ServiceDate);
-- Here ------------^
我附上了三张图片。
一个显示查询设计
第二个显示查询输出
第三个显示 table 数据(没有任何查询)
我正在尝试使用 SQL 到 select 唯一重复的服务日期,其所有记录都包含在一个 table 中。这是一个从 table:
开始的示例GroupID | ServiceID | ServiceDate |
---|---|---|
A | X | 1/1/2010 |
A | Y | 1/1/2010 |
A | Z | 10/1/2010 |
我已经想出如何找到 2 条具有相同日期的不同记录并将它们排成一行,但我最终得到了一些重复的 table,因为它正在将每条记录与所有其他记录进行比较:
GroupID | ServiceID1 | ServiceDate1 | ServiceID2 | ServiceDate2 |
---|---|---|---|---|
A | X | 1/1/2010 | Y | 1/1/2010 |
A | Y | 1/1/2010 | X | 1/1/2010 |
我不想要最后一行,因为它本质上是第一行的副本。
关于如何摆脱第二行的任何想法?
这是一些复制代码(这是我的 SQL Fiddle:http://sqlfiddle.com/#!9/537d84)
CREATE TABLE MyTable (
GroupID varchar(255),
ServiceID varchar(255),
ServiceDate Date
);
INSERT INTO MyTable (GroupID, ServiceID, ServiceDate)
VALUES ("A", "X", '2010-01-01'),
("A", "Y", '2010-01-01'),
("A", "Z", '2010-10-01');
SELECT DISTINCT
c1.ServiceID AS ServiceID1, c1.ServiceDate AS ServiceDate1,
c2.ServiceID AS ServiceID2, c2.ServiceDate AS ServiceDate2
FROM MyTable c1 INNER JOIN MyTable c2
ON c1.GroupID = c2.GroupID
WHERE (c1.ServiceID <> c2.ServiceID AND c1.ServiceDate = c2.ServiceDate);
注意:我认为我可以创建 A-B 和 B-A 组合 ID 变量,然后对它们 SELECT DISTINCT。不幸的是,这是 SQL 的一个比 MS Access 功能稍差的版本(技术上,我使用 Microsoft.ACE.OLEDB.12.0 连接字符串在 VBA 中编写它),所以有没有 CONCAT 函数,也没有 CASE WHEN 子句,语法效率方面存在其他缺陷。
关于如何摆脱第二行的任何想法?
由于您使用的是 <>
条件,因此您总是会得到重复的结果(x-y 和 y-x)。您可以任意决定较小的 ServiceId
应该始终位于 c1
:
<>
SELECT DISTINCT
c1.ServiceID AS ServiceID1, c1.ServiceDate AS ServiceDate1,
c2.ServiceID AS ServiceID2, c2.ServiceDate AS ServiceDate2
FROM MyTable c1 INNER JOIN MyTable c2
ON c1.GroupID = c2.GroupID
WHERE (c1.ServiceID < c2.ServiceID AND c1.ServiceDate = c2.ServiceDate);
-- Here ------------^
我附上了三张图片。
一个显示查询设计 第二个显示查询输出 第三个显示 table 数据(没有任何查询)