Sql 根据特定条件从一个与另一个相关的表中检索记录

Sql 根据特定条件从一个与另一个相关的表中检索记录,sql,Sql,我需要你的SQL帮助。 我有一个表,它有唯一的id,并且在第二个和第三个表中用作引用。第二个表可以有多个引用id条目。但是,我只希望从第二个表检索id和详细信息,其中第三个表中的引用相同,但第二个表中的所有记录没有相同的描述 示例:简化 表1:对象id为自动递增且始终唯一 ------------------------------- | object_id | object_name | ------------------------------- | 1234 |

我需要你的SQL帮助。 我有一个表,它有唯一的id,并且在第二个和第三个表中用作引用。第二个表可以有多个引用id条目。但是,我只希望从第二个表检索id和详细信息,其中第三个表中的引用相同,但第二个表中的所有记录没有相同的描述

示例:简化 表1:对象id为自动递增且始终唯一

-------------------------------
|  object_id  |  object_name  |
-------------------------------
|     1234    |      Julian   |
-------------------------------
|     1235    |      Adrian   |
-------------------------------
|     1236    |      Sarah    |
-------------------------------
|     1237    |      Julian   |
-------------------------------
|     1238    |      Julian   |
-------------------------------
表2:object\u id引用表1 object\u id,但account\u no可以是任何内容

-------------------------------
|  object_id  |  account_no   |
-------------------------------
|     1234    |      1111     |
-------------------------------
|     1234    |      2222     |
-------------------------------
|     1235    |      3333     |
-------------------------------
|     1236    |      4444     |
-------------------------------
|     1236    |      5555     |
-------------------------------
|     1237    |      1111     |
-------------------------------
|     1238    |      1111     |
-------------------------------
表3:object\u id引用表1 object\u id,但属性\u id对于特定帐户\u no应相同

-------------------------------
|  object_id  |  property_id  |
-------------------------------
|     1234    |      house_1  |
-------------------------------
|     1235    |      house_15 |
-------------------------------
|     1236    |      house_7  |
-------------------------------
|     1236    |      house_7  |
-------------------------------
|     1237    |      house_2  |
-------------------------------
|     1238    |      house_1  |
-------------------------------
因此,我需要的摘录是表3中的所有行,其中对于表2中给定的帐户,属性id与表1中的对象id和对象名称不同

结果:

---------------------------------------------------------------
|  object_id  |  object_name  |  account_no   |  property_id  |
---------------------------------------------------------------
|     1234    |      Julian   |      1111     |      house_1  |
---------------------------------------------------------------
|     1237    |      Julian   |      1111     |      house_2  |
---------------------------------------------------------------
|     1238    |      Julian   |      1111     |      house_1  |
---------------------------------------------------------------
因此,账号是链接记录的账号,但它们都引用到属性id的对象id。我需要属性id不匹配的账户的所有记录,具有单个属性id的账户,或者有多个账户但可以忽略相同属性id的账户的所有记录

因此,要获得所有信息,应该是:

SELECT ob.object_id, ob.object_name, ac.account_no, pr.property_id
FROM Table1 AS ob
LEFT JOIN Table2 AS ac ON ob.object_id = ac.object_id
LEFT JOIN Table3 AS pr ON ob.object_id = pr.object_id
这将返回将帐户号和属性号链接到对象号的所有行,但我只希望返回属性号与给定帐户号不匹配的行


我已经尝试了连接、存在和各种选项,但我无法找出这一个。非常感谢您的帮助。

您可以使用窗口函数来确定值不完全相同的时间:

select object_id, object_name, account_no, property_id
from (select t1.object_id, t1.object_name, t2.account_no, t3.property_id,
             min(t3.property_id) over (partition by t1.object_name, t2.account_no) as min_pi,
             max(t3.property_id) over (partition by t1.object_name, t2.account_no) as max_pi
      from table1 t1 join
           table2 t2
           on t2.object_id = t1.object_id join
           table3 t3
           on t3.object_id = t1.object_id
     ) t
where min_pi <> max_pi;

可以使用窗口函数确定值不完全相同的时间:

select object_id, object_name, account_no, property_id
from (select t1.object_id, t1.object_name, t2.account_no, t3.property_id,
             min(t3.property_id) over (partition by t1.object_name, t2.account_no) as min_pi,
             max(t3.property_id) over (partition by t1.object_name, t2.account_no) as max_pi
      from table1 t1 join
           table2 t2
           on t2.object_id = t1.object_id join
           table3 t3
           on t3.object_id = t1.object_id
     ) t
where min_pi <> max_pi;

谢谢Gordon,SQL不会返回任何行。i fi删除where min_pi max_pi,然后返回所有行,但where子句似乎不会返回具有不同属性id的不同行。不过我们似乎走对了方向。@EDWOZ。对象id不应位于分区中。我看到它在每一行上都发生了变化。谢谢戈登,SQL不会返回任何行。i fi删除where min_pi max_pi,然后返回所有行,但where子句似乎不会返回具有不同属性id的不同行。不过我们似乎走对了方向。@EDWOZ。对象id不应位于分区中。我看到每一行都在变化。