Join语句中的Where / And子句以避免重复

时间:2014-09-22 05:11:16

标签: sql join where-clause no-duplicates

我是SQL的新手 - 我已经查看了这些帖子但是我的问题的答案还不能很好地对不起。我试图在我的join子句中使用where /或语句来做我认为应该是一个简单的查询。

问题是我似乎得到了重复。以下是我使用的代码:

  select A.[AuctionId], AA.attribute_id
  from [auction] A
  left join [auction_attribute] AA
  on AA.auction_id = A.AuctionId
  where AA.attribute_id = 127
  or (AA.attribute_id = 132 and AA.text_data = 'USABLE')  

我想获取属性ID为127的所有记录,并且记录的属性132还需要具有关联的text_data' USABLE'如果这有意义的话?一条记录可以有多个属性ID,所以我想获得与其132相关联的text_data也是“可用”的所有127个。我最初使用子查询完成了查询,但我认为这样做是一种更有效的方法,只要我能做到正确!

以上内容目前正在返回重复记录,如果我替换“或”#39;用'和'我没有记录。任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

编辑:根据Turophile建议用简单的内连接替换左外连接(谢谢)

您的实际查询意味着:

获取属性值为127的所有记录,以及与USABLE关联的属性值为132的所有记录。

如果它确实是您所需要的,但没有重复,则查询可能如下:

select distinct A.[AuctionId], AA.attribute_id
from [auction] A
     join [auction_attribute] AA
         on AA.auction_id = A.AuctionId
where    AA.attribute_id = 127
     or (AA.attribute_id = 132 and AA.text_data = 'USABLE')

您的描述似乎是:

获取属性为127 AND且属性为132的记录与USABLE相关

如果是你想要的,那么查询应该是:

select A.[AuctionId], AA.attribute_id, AA2.attribute_id
from [auction] A
     join [auction_attribute] AA
         on AA.auction_id = A.AuctionId
     join [auction_attribute] AA2
         on AA2.auction_id = A.AuctionId
where    AA.attribute_id = 127
     and (AA2.attribute_id = 132 and AA2.text_data = 'USABLE')

是SQL,如果你给它不同的别名,你可以多次使用相同的表。

编辑:根据Turophile的建议,我在查询中使用了简单的内部联接。只有当你想从一个表中获取记录时才需要使用外连接,即使其他表不包含它们也是如此。