Sql 表上的自联接如何返回比表中实际数据更多的行?

Sql 表上的自联接如何返回比表中实际数据更多的行?,sql,oracle,join,Sql,Oracle,Join,此查询1返回9行,其中一行包含额外的分区代码AII,而在表TRAIN\u RUNNING\u INFO中,只有一个分区的记录JU,可通过查询3的输出进行验证。请说明为什么第一次查询返回额外分区AII的记录 --------------------问题1----------------------- SELECT A.TRAIN_ID,A.TRAIN_NUMBER,A.TRAIN_START_DATE,A.SOURCE,A.DESTINATION,B.DIVISION_CODE,B.STATIO

此查询1返回9行,其中一行包含额外的分区代码
AII
,而在表
TRAIN\u RUNNING\u INFO
中,只有一个分区的记录
JU
,可通过查询3的输出进行验证。请说明为什么第一次查询返回额外分区AII的记录

--------------------问题1-----------------------

 SELECT A.TRAIN_ID,A.TRAIN_NUMBER,A.TRAIN_START_DATE,A.SOURCE,A.DESTINATION,B.DIVISION_CODE,B.STATION_CODE,A.SCHEDULED_DATE,
    B.ACTUAL_DATE,B.ACTUAL_TIME,A.ACTUAL_DATE AS REPORT_DATE FROM
     (
      SELECT DISTINCT TRAIN_ID,TRAIN_NUMBER,TRAIN_START_DATE,ACTUAL_DATE,SOURCE,DESTINATION,SCHEDULED_DATE,MY_RANK FROM
      (
     SELECT DISTINCT TRAIN_ID,TRAIN_NUMBER,TRAIN_START_DATE,ACTUAL_DATE,SOURCE,DESTINATION,DIVISION_CODE,SCHEDULED_DATE
     ,RANK() OVER (PARTITION BY TRAIN_ID,TRAIN_START_DATE ORDER BY ACTUAL_DATE DESC ,ACTUAL_TIME DESC)AS MY_RANK
     FROM TRAIN_RUNNING_INFO
                WHERE TRAIN_CATG='L'
                AND TRAIN_ID='BGK 140920212028'
        )WHERE MY_RANK=1 AND ACTUAL_DATE='15-Sep-2020'
     )A,TRAIN_RUNNING_INFO B
     WHERE A.TRAIN_ID=B.TRAIN_ID
     AND A.TRAIN_START_DATE=B.TRAIN_START_DATE
      ORDER BY ACTUAL_DATE,ACTUAL_TIME
SELECT DISTINCT * FROM TRAIN_RUNNING_INFO
            WHERE TRAIN_CATG='L'
            AND TRAIN_ID='BGK 140920212028'
SELECT DISTINCT DIVISION_CODE FROM   TRAIN_RUNNING_INFO
            WHERE TRAIN_CATG='L'
            AND TRAIN_ID='BGK 140920212028' AND TRAIN_START_DATE='14-Sep-2020'
此查询的输出为

-------------------表中存在的记录(查询2)-----------------------------------------------

 SELECT A.TRAIN_ID,A.TRAIN_NUMBER,A.TRAIN_START_DATE,A.SOURCE,A.DESTINATION,B.DIVISION_CODE,B.STATION_CODE,A.SCHEDULED_DATE,
    B.ACTUAL_DATE,B.ACTUAL_TIME,A.ACTUAL_DATE AS REPORT_DATE FROM
     (
      SELECT DISTINCT TRAIN_ID,TRAIN_NUMBER,TRAIN_START_DATE,ACTUAL_DATE,SOURCE,DESTINATION,SCHEDULED_DATE,MY_RANK FROM
      (
     SELECT DISTINCT TRAIN_ID,TRAIN_NUMBER,TRAIN_START_DATE,ACTUAL_DATE,SOURCE,DESTINATION,DIVISION_CODE,SCHEDULED_DATE
     ,RANK() OVER (PARTITION BY TRAIN_ID,TRAIN_START_DATE ORDER BY ACTUAL_DATE DESC ,ACTUAL_TIME DESC)AS MY_RANK
     FROM TRAIN_RUNNING_INFO
                WHERE TRAIN_CATG='L'
                AND TRAIN_ID='BGK 140920212028'
        )WHERE MY_RANK=1 AND ACTUAL_DATE='15-Sep-2020'
     )A,TRAIN_RUNNING_INFO B
     WHERE A.TRAIN_ID=B.TRAIN_ID
     AND A.TRAIN_START_DATE=B.TRAIN_START_DATE
      ORDER BY ACTUAL_DATE,ACTUAL_TIME
SELECT DISTINCT * FROM TRAIN_RUNNING_INFO
            WHERE TRAIN_CATG='L'
            AND TRAIN_ID='BGK 140920212028'
SELECT DISTINCT DIVISION_CODE FROM   TRAIN_RUNNING_INFO
            WHERE TRAIN_CATG='L'
            AND TRAIN_ID='BGK 140920212028' AND TRAIN_START_DATE='14-Sep-2020'
此查询的输出为

-----------------------------分部验证(问题3)---------------------------------

 SELECT A.TRAIN_ID,A.TRAIN_NUMBER,A.TRAIN_START_DATE,A.SOURCE,A.DESTINATION,B.DIVISION_CODE,B.STATION_CODE,A.SCHEDULED_DATE,
    B.ACTUAL_DATE,B.ACTUAL_TIME,A.ACTUAL_DATE AS REPORT_DATE FROM
     (
      SELECT DISTINCT TRAIN_ID,TRAIN_NUMBER,TRAIN_START_DATE,ACTUAL_DATE,SOURCE,DESTINATION,SCHEDULED_DATE,MY_RANK FROM
      (
     SELECT DISTINCT TRAIN_ID,TRAIN_NUMBER,TRAIN_START_DATE,ACTUAL_DATE,SOURCE,DESTINATION,DIVISION_CODE,SCHEDULED_DATE
     ,RANK() OVER (PARTITION BY TRAIN_ID,TRAIN_START_DATE ORDER BY ACTUAL_DATE DESC ,ACTUAL_TIME DESC)AS MY_RANK
     FROM TRAIN_RUNNING_INFO
                WHERE TRAIN_CATG='L'
                AND TRAIN_ID='BGK 140920212028'
        )WHERE MY_RANK=1 AND ACTUAL_DATE='15-Sep-2020'
     )A,TRAIN_RUNNING_INFO B
     WHERE A.TRAIN_ID=B.TRAIN_ID
     AND A.TRAIN_START_DATE=B.TRAIN_START_DATE
      ORDER BY ACTUAL_DATE,ACTUAL_TIME
SELECT DISTINCT * FROM TRAIN_RUNNING_INFO
            WHERE TRAIN_CATG='L'
            AND TRAIN_ID='BGK 140920212028'
SELECT DISTINCT DIVISION_CODE FROM   TRAIN_RUNNING_INFO
            WHERE TRAIN_CATG='L'
            AND TRAIN_ID='BGK 140920212028' AND TRAIN_START_DATE='14-Sep-2020'
此查询的输出为


如果列车运行信息中的记录具有相同的列车id和列车开始日期,则可能发生这种情况。尝试此查询,从列车运行信息组中按列车id查找选择计数(1)、列车id、列车开始日期的记录,列车开始日期的计数(1)>1;您正在筛选表(子查询A),然后再次将结果与该表连接。你确定有必要吗?好的。出现“全部”部分是因为列车运行信息中有一条记录具有相同的列车ID='BGK 140920212028',列车开始日期和区段代码='All'。因此,您正在子查询A中筛选trains表,然后将其再次与源表联接。我不确定所有这些背后的逻辑是什么,但我建议您不要加入A和B,因为这会使您的所有筛选接近无点。如果您能够为这种情况创建一个DBFIDLE,我们可以一起看到问题出在哪里hides@radha,我删除了我的答案,可能是我错了,我确实相信SQL不会靠自己创造奇迹。您显示的数据中缺少某些内容。e、 g.查询2中的
TRAIN\u CATG='L'
在哪里,即使它说的是
select*
。?按照@ekochergin的建议,请创建小提琴。我个人觉得,如果没有这些数据,我很难想象。之所以说“为什么”,是因为SQL就是这样工作的。请准确解释您的期望和原因,参考权威文档,或者我们不知道您的误解是什么&您只是要求再做一次演示和个性化教程,请在代码问题中给出答案。请使用文本,而不是图像/链接,了解可以用文本表达的内容。请通过编辑澄清,而不是评论。