0

我有一个提供所需结果的现有查询 - 但我需要从另一个表中添加一列并且仍然得到相同的 203 行......当我尝试加入该表时,我得到了数千行......

select a.state, a.alternate_id, a.reg_id 
from altid1 a, altid1 b 
where a.alternate_id=b.alternate_id 
and a.reg_id <> b.reg_id 
group by  a.state, a.alternate_id, a.reg_id
having count(a.alternate_id)>1
order by state, alternate_id,reg_id;

这给了我状态和具有多个 reg_ids 的每个备用 id...现在我需要添加两个在 altid1 表中不存在的所有者字段

我需要加入所有者表并仅使用附加列获得相同的 203 结果...所有者表确实包含 reg_id 列但是当我尝试获取具有不同 reg_id 的列时如何匹配在原始表中?

select a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1 
from altid1 a, altid1 b, owner c 
where a.alternate_id=b.alternate_id 
and a.reg_id <> b.reg_id
group by  a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1
having count(a.alternate_id)>1
order by state, alternate_id, reg_id;

谢谢您的帮助!

4

2 回答 2

0

试试他的,确保将 [id column] 更改为实际字段名称,并且 a 或 b 表与 c 表有关系。

  select a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1 
    from altid1 a, altid1 b, owner c 
    where a.alternate_id=b.alternate_id 
    and a.reg_id <> b.reg_id
    and c.[id column] = a or b . [id column] -- change id column to actual id field from the table and change a or b to the correct table having relationship with c table.
    group by  a.state, a.alternate_id, a.reg_id, c.owner1, c.ownertype1
    having count(a.alternate_id)>1
    order by state, alternate_id, reg_id;
于 2013-10-18T16:11:42.830 回答
0

当您添加owner到您选择的表时,您没有添加额外的连接条件。这意味着您在原始 203 行结果和owner.

两个表之间的交叉连接,AB为每对可能的行返回一行,其中一个 inA和一个 in B。因此,如果An行并且Bm行,则A交叉连接Bm*n行。不好。

您需要做的是在 where 语句中添加一个附加子句。我无法从您的代码中确切地说出那将是什么。是否有一些链接owner到的列altid1

但是,也许更重要的是,不要使用逗号连接。它们使意外创建交叉连接和许多其他可怕的事情变得非常容易。如果您不小心在大型数据库上进行了交叉连接,您很快就会得到数百万行。

而是仅使用 where 子句过滤结果并使用标准JOIN语法连接其他表。

您的原始查询将变为:

select a.state, a.alternate_id, a.reg_id 
from altid1 a
inner join altid1 b
   on a.alternate_id = b.alternate_id
where a.reg_id <> b.reg_id 
group by  a.state, a.alternate_id, a.reg_id
having count(a.alternate_id)>1
order by state, alternate_id,reg_id;

然后你的新查询看起来像这样(我只是猜测链接owner到什么altid1):

select a.state, a.alternate_id, a.reg_id 
from altid1 a
inner join altid1 b
   on a.alternate_id = b.alternate_id
inner join owner c
   on c.owner_id = a.owner_id
where a.reg_id <> b.reg_id 
group by  a.state, a.alternate_id, a.reg_id
having count(a.alternate_id)>1
order by state, alternate_id,reg_id;

请注意,我使用了内部连接!我无法从您那里得知是否owner应该使用内部联接或左联接引入。对差异的简短解释是内部连接不会包含owner无法找到匹配行的行。

PS不要使用逗号连接

于 2013-10-18T16:26:52.023 回答