SQL 加入 ADODB
SQL Joins ADODB
我有两个 tables,内部和外部。
两个 table 都有相同的列,即。标题、姓名、地址、ID、RefNo、MergeRefNo、状态
假设 'External' table 有以下数据:
<table style="width: 351px;">
<tbody>
<tr>
<td style="width: 38px;">Title</td>
<td style="width: 43px;">Name</td>
<td style="width: 59px;">Address</td>
<td style="width: 25px;">Id</td>
<td style="width: 52px;">RefNo</td>
<td style="width: 86px;">MergeRefNo</td>
<td style="width: 47px;">Status</td>
</tr>
<tr>
<td style="width: 38px;">Mr.</td>
<td style="width: 43px;">White</td>
<td style="width: 59px;">123</td>
<td style="width: 25px;">D1</td>
<td style="width: 52px;">100_A</td>
<td style="width: 86px;">NULL</td>
<td style="width: 47px;">A</td>
</tr>
<tr>
<td style="width: 38px;">Ms.</td>
<td style="width: 43px;">Rita</td>
<td style="width: 59px;">234</td>
<td style="width: 25px;">D2</td>
<td style="width: 52px;">100_B </td>
<td style="width: 86px;">NULL </td>
<td style="width: 47px;">A </td>
</tr>
<tr>
<td style="width: 38px;">Dr.</td>
<td style="width: 43px;">CP</td>
<td style="width: 59px;">678</td>
<td style="width: 25px;">D3</td>
<td style="width: 52px;">100_C</td>
<td style="width: 86px;">100_B</td>
<td style="width: 47px;">M </td>
</tr>
</tbody>
</table>
而 'Internal' table 的数据如下:
<table style="width: 351px;">
<tbody>
<tr>
<td style="width: 38px;">Title</td>
<td style="width: 43px;">Name</td>
<td style="width: 59px;">Address</td>
<td style="width: 25px;">Id</td>
<td style="width: 52px;">RefNo</td>
<td style="width: 86px;">MergeRefNo</td>
<td style="width: 47px;">Status</td>
</tr>
<tr>
<td style="width: 38px;">Mr.</td>
<td style="width: 43px;">John</td>
<td style="width: 59px;">XYZ</td>
<td style="width: 25px;">D1</td>
<td style="width: 52px;">100_A</td>
<td style="width: 86px;">NULL</td>
<td style="width: 47px;">A</td>
</tr>
<tr>
<td style="width: 38px;">Ms.</td>
<td style="width: 43px;">Blue</td>
<td style="width: 59px;">CDE</td>
<td style="width: 25px;">M6</td>
<td style="width: 52px;">100_B </td>
<td style="width: 86px;">NULL </td>
<td style="width: 47px;">A </td>
</tr>
<tr>
<td style="width: 38px;">Dr.</td>
<td style="width: 43px;">CP</td>
<td style="width: 59px;">678</td>
<td style="width: 25px;">D3</td>
<td style="width: 52px;">100_C</td>
<td style="width: 86px;">100_B</td>
<td style="width: 47px;">M </td>
</tr>
</tbody>
</table>
要求是,tables 中的 ID 相同且状态为 'A'(或)RefNos 相同且状态为('A','M' ), 'Internal' 中的数据应该覆盖 'External'.
因此,在上面的示例中,由于两个 D1 在两个 table 中都是公共的,因此 'White' 应该替换为 'John'。此外,'Rita' 应该被 'Blue' 覆盖,因为 Refnos 相等(即 100_B,尽管 ID 不同)
所以我写了下面的查询
select isnull(c.title,isnull(b.title,a.title)),isnull(c.initials,isnull(b.initials,a.initials)),isnull(c.forename,isnull(b.forename,a.forename)),isnull(c.surname,isnull(b.surname,a.surname)),isnull(c.id,isnull(b.id,a.id))
from external a
left join internal b on a.id = b.id -- and status = 'a' -- unable to use this in ADO
left join internal c on c.refno= a.refno -- and status in ('a','m') -- unable to use this in ADO
但是当 'external' 中有值(例如 XYZ)需要替换为 Internal 中的 'null' 数据时,由于 IsNull,上述查询失败。我怎么能实际使用满足两个连接条件的 'Internal' table 值(即 ID 相同(或)Refnos 相同)。
(对格式不当表示歉意)
(如查询中所述,无法在 ADODB 的连接条件中使用过滤器。有什么线索吗?)
非常感谢!
我找到了一种拆分两个查询并使用 UNION 连接它们的方法。
select a.title, a.initials, a.forename, a.surname, a.id
from internal a
inner join external b on a.id = b.id
where a.status = 'a'
union
select a.title, a.initials, a.forename, a.surname, a.id
from internal a
inner join external b on a.refno = b.refno
where a.status in ('a','m')
它按预期工作,但是,如果有更好的选择,请告诉我。
谢谢
我有两个 tables,内部和外部。 两个 table 都有相同的列,即。标题、姓名、地址、ID、RefNo、MergeRefNo、状态
假设 'External' table 有以下数据:
<table style="width: 351px;">
<tbody>
<tr>
<td style="width: 38px;">Title</td>
<td style="width: 43px;">Name</td>
<td style="width: 59px;">Address</td>
<td style="width: 25px;">Id</td>
<td style="width: 52px;">RefNo</td>
<td style="width: 86px;">MergeRefNo</td>
<td style="width: 47px;">Status</td>
</tr>
<tr>
<td style="width: 38px;">Mr.</td>
<td style="width: 43px;">White</td>
<td style="width: 59px;">123</td>
<td style="width: 25px;">D1</td>
<td style="width: 52px;">100_A</td>
<td style="width: 86px;">NULL</td>
<td style="width: 47px;">A</td>
</tr>
<tr>
<td style="width: 38px;">Ms.</td>
<td style="width: 43px;">Rita</td>
<td style="width: 59px;">234</td>
<td style="width: 25px;">D2</td>
<td style="width: 52px;">100_B </td>
<td style="width: 86px;">NULL </td>
<td style="width: 47px;">A </td>
</tr>
<tr>
<td style="width: 38px;">Dr.</td>
<td style="width: 43px;">CP</td>
<td style="width: 59px;">678</td>
<td style="width: 25px;">D3</td>
<td style="width: 52px;">100_C</td>
<td style="width: 86px;">100_B</td>
<td style="width: 47px;">M </td>
</tr>
</tbody>
</table>
而 'Internal' table 的数据如下:
<table style="width: 351px;">
<tbody>
<tr>
<td style="width: 38px;">Title</td>
<td style="width: 43px;">Name</td>
<td style="width: 59px;">Address</td>
<td style="width: 25px;">Id</td>
<td style="width: 52px;">RefNo</td>
<td style="width: 86px;">MergeRefNo</td>
<td style="width: 47px;">Status</td>
</tr>
<tr>
<td style="width: 38px;">Mr.</td>
<td style="width: 43px;">John</td>
<td style="width: 59px;">XYZ</td>
<td style="width: 25px;">D1</td>
<td style="width: 52px;">100_A</td>
<td style="width: 86px;">NULL</td>
<td style="width: 47px;">A</td>
</tr>
<tr>
<td style="width: 38px;">Ms.</td>
<td style="width: 43px;">Blue</td>
<td style="width: 59px;">CDE</td>
<td style="width: 25px;">M6</td>
<td style="width: 52px;">100_B </td>
<td style="width: 86px;">NULL </td>
<td style="width: 47px;">A </td>
</tr>
<tr>
<td style="width: 38px;">Dr.</td>
<td style="width: 43px;">CP</td>
<td style="width: 59px;">678</td>
<td style="width: 25px;">D3</td>
<td style="width: 52px;">100_C</td>
<td style="width: 86px;">100_B</td>
<td style="width: 47px;">M </td>
</tr>
</tbody>
</table>
要求是,tables 中的 ID 相同且状态为 'A'(或)RefNos 相同且状态为('A','M' ), 'Internal' 中的数据应该覆盖 'External'.
因此,在上面的示例中,由于两个 D1 在两个 table 中都是公共的,因此 'White' 应该替换为 'John'。此外,'Rita' 应该被 'Blue' 覆盖,因为 Refnos 相等(即 100_B,尽管 ID 不同)
所以我写了下面的查询
select isnull(c.title,isnull(b.title,a.title)),isnull(c.initials,isnull(b.initials,a.initials)),isnull(c.forename,isnull(b.forename,a.forename)),isnull(c.surname,isnull(b.surname,a.surname)),isnull(c.id,isnull(b.id,a.id))
from external a
left join internal b on a.id = b.id -- and status = 'a' -- unable to use this in ADO
left join internal c on c.refno= a.refno -- and status in ('a','m') -- unable to use this in ADO
但是当 'external' 中有值(例如 XYZ)需要替换为 Internal 中的 'null' 数据时,由于 IsNull,上述查询失败。我怎么能实际使用满足两个连接条件的 'Internal' table 值(即 ID 相同(或)Refnos 相同)。
(对格式不当表示歉意)
(如查询中所述,无法在 ADODB 的连接条件中使用过滤器。有什么线索吗?)
非常感谢!
我找到了一种拆分两个查询并使用 UNION 连接它们的方法。
select a.title, a.initials, a.forename, a.surname, a.id
from internal a
inner join external b on a.id = b.id
where a.status = 'a'
union
select a.title, a.initials, a.forename, a.surname, a.id
from internal a
inner join external b on a.refno = b.refno
where a.status in ('a','m')
它按预期工作,但是,如果有更好的选择,请告诉我。
谢谢