获取记录的所有行,其中单个实例出现在记录的不同行中

时间:2014-05-29 15:31:48

标签: sql sql-server-2008 tsql

我有一个查询,我正在查看三个不同的表,为了这篇文章的目的,我只需要看到三列; RecordID,FieldType和Tranid。记录ID可以有多个Field类型,每个字段类型都有一个不同的tranid。

enter image description here

如果任何字段类型='CO'

,我想要做的就是获取所有数据集
    SELECT     
        Header.RecordID, 
        Detail.FieldType, 
        Header.TranID
    FROM Header 
        INNER JOIN (select * from Detail where fieldtype = 'CO') as Detail 
        ON Header.RecordID = Detail.RecordID 
        INNER JOIN TranDef ON Header.TranID = TranDef.TranID
    WHERE     
        (Header.CalendarDate BETWEEN GETDATE() - 10 AND GETDATE())

但这不起作用。我只返回一行数据,正如我所说,我想要记录的所有数据,而不仅仅是一行。我在这里做错了什么?

3 个答案:

答案 0 :(得分:3)

您的查询不起作用,因为它将从Detail选择的行限制为fieldtype = 'CO',以及内部联接。

看起来您正在寻找WHERE EXISTS查询:

SELECT     
h.RecordID, 
d.FieldType, 
h.TranID
FROM
     Branch b
INNER JOIN
     Header h ON b.BranchID = h.BranchID
INNER JOIN
     Detail d ON h.RecordID = d.RecordID
WHERE (h.CalendarDate BETWEEN GETDATE() - 10 AND GETDATE())
  AND EXISTS (
      SELECT *
      FROM Detail dd
      WHERE dd.RecordID = h.RecordID AND dd.fieldtype = 'CO'
  )

想法是加入所有Detail条记录,然后根据链接到相应{'CO'行的Detail条记录中是否存在Header条记录来过滤结果1}}行。

答案 1 :(得分:0)

您可以尝试在WHERE标准中包含以下内容:

SELECT RecordID, FieldType, TranID
FROM Branch br, Header hr, Region rgn
WHERE br.FieldType = 'CO' and 
      hr.FieldType = 'CO' and  
      rgn.FieldType = 'CO' 

答案 2 :(得分:0)

我觉得你让它变得比它应该更复杂。也许尝试以下?我知道我过去做过类似的事情。

SELECT     
    h.RecordID, 
    d.FieldType, 
    h.TranID
FROM Header as h
    INNER JOIN Branch as b on b.BranchID  = h.BranchID
    INNER JOIN Detail as d on d.RecordID = h.RecordID
WHERE
   (h.CalendarDate BETWEEN GETDATE() - 10 AND GETDATE())
    and d.fieldtype = 'CO'