3

如何在 SQL 选择语句中执行此操作..

考虑到我有这张桌子

ID_A - DATE1 - DATE2
=====================
CD99 - 11/25 - 12/08
AB23 - 11/20 - 11/22
AB23 - 11/22 - 12/01
XP72 - 11/23 - 12/08

您会注意到 ID_A=AB23 有两个条目,第一行的 DATE2 等于第二行的 DATE1,这意味着这两行是连接的。

那么,如何获取或创建我的 select 语句来查看这些相互连接的行?

编辑:我在选择语句中试图做的是:a。检查 DATE2 是否不为空 b。从那里,检查 DATE2 是否存在于整个表的 DATE1 中并返回列的值。

我想得到的应该是这样的:

ID_A - DATE1 - DATE2
=====================
AB23 - 11/20 - 11/22
AB23 - 11/22 - 12/01

PS我希望不要使用循环来执行此操作。因为当我拥有太多数据时,这会使服务器响应速度太慢。- 请注意,我正在比较同一数据库中的列..

@fthiella 这是我的示例数据,我指的是场景。

ID_A - DATE1 - DATE2
=====================
CD99 - 11/25 - 12/08
AB23 - 11/20 - 11/22
AB23 - 11/22 - 12/01
XP72 - 11/23 - 12/08
PQ10 - 11/20 - -n/a-
LM88 - 11/21 - -n/a-
PQ10 - 11/15 - 11/20

从那里我想得到这些:

ID_A - DATE1 - DATE2
=====================
CD99 - 11/25 - 12/08
AB23 - 11/22 - 12/01
XP72 - 11/23 - 12/08

这是我为什么排除其他人的快速解释:

ID_A - DATE1 - DATE2
=====================
CD99 - 11/25 - 12/08 - not excluded
AB23 - 11/20 - 11/22 - excluded because DATE2 is connected to DATE1 of same ID_A
AB23 - 11/22 - 12/01 - not excluded
XP72 - 11/23 - 12/08 - not excluded
PQ10 - 11/20 - -n/a- - excluded because DATE2 is null
LM88 - 11/21 - -n/a- - excluded because DATE2 is null
PQ10 - 11/15 - 11/20 - excluded because DATE2 is connected to DATE1 of same ID_A (regardless if DATE2 of that line is null)

条件的优先级可以是 - 首先排除 null DATE2,然后检查比较并排除那些在其他行之前的行。

很抱歉花这么多时间,我真的很感谢你给我的每一个帮助.. 现在这个问题可以标记为已回答,再次感谢 fthiella..

4

3 回答 3

1
SELECT date1.* FROM DATES date1 JOIN DATES date2 On date1.ID_A = date1.ID_A
WHERE date1.DATE2 = date2.DATE1
UNION
SELECT D2.* FROM DATES date1 JOIN DATES date2 On date1.ID_A = date2.ID_A
WHERE date1.DATE2 = date2.DATE1
于 2013-08-28T03:21:52.040 回答
0

你可以试试这个

SELECT D1.* FROM DATES D1
JOIN DATES D2
On D1.ID_A = D2.ID_A
WHERE D1.DATE2 = D2.DATE1

UNION

SELECT D2.* FROM DATES D1
JOIN DATES D2
On D1.ID_A = D2.ID_A
WHERE D1.DATE2 = D2.DATE1
于 2012-11-29T08:43:43.097 回答
0

我会这样做:

SELECT
  your_table.*
FROM
  your_table inner join your_table your_table_1
  on your_table.ID_A=your_table_1.ID_A
     and (your_table.DATE2 = your_table_1.DATE1
          or your_table.DATE1 = your_table_1.DATE2)

your_table使用 加入自身,inner join因此只有在每一行都有一个连接(相同的 ID_A、DATE2=DATE1 或 DATE1=DATE2)时,它才会返回行。

编辑:根据您的评论,这应该为您提供没有连接的记录:

SELECT your_table.*
FROM
  your_table left join your_table your_table_1
  on your_table.ID_A=your_table_1.ID_A
     and (your_table.DATE2 = your_table_1.DATE1)
WHERE your_table_1.ID_A is null
      and your_table.DATE2 is not null

在这里,我your_table使用左连接加入自身,并且 ID_A 的过滤结果为空。这意味着此查询将返回 your_table 中的每条记录,但同一表中 DATE2 等于 DATE1 的记录除外。如果 DATE2 已经为空,则连接不会成功,因此将返回行。

于 2012-11-29T08:51:46.850 回答