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