2016-04-20 41 views
2

我有一张看起来像这样的表。SQL Server:在同一个表中加入对方的记录

我想实现

  1. 我要选择属于一个整体的行(根据我所提供的规则)

  2. 那么我想搜索F型行有什么日期比已根据2015年

发生 2016年1月1日和O型行大个

样本数据:

type  docnr   connection1  connection2 date 
F 40195.000000   36950.000000  0.000000 2016-01-29 00:00 
O 36950.000000    0.000000 40195.000000 2015-01-29 00:00 

正如你看到的,行的类型决定了连接到其他的谎言。

  • F型:连接到另一排位于连接2
  • O型:连接到另一排位于连接1

如果我要选择所有的行属于彼此我该怎么做?

到目前为止,我已经试图创造一个自我参照表

SELECT * 
FROM 
    (SELECT 
     faktoofen.datum1 as faktdatum, 
     faktoofen.doknr as faktdok, 
     ordoofen.doknr as orddok, 
     ordoofen.datum1 as orddatum 
    FROM 
     [FTG1].[dbo].[oof] as faktoofen, 
     [FTG1].[dbo].[oof] as ordoofen 
    WHERE 
     (faktoofen.doknr = ordoofen.koppl_dok2 
     OR ordoofen.doknr = faktoofen.koppl_dok1) 
) as subq1 
WHERE 
    YEAR(subq1.orddatum) = '2015' 
    AND YEAR(subq1.faktdatum) = '2016' 

这似乎有点笨拙,我能感觉到一个联盟将在这里工作,但我看不出。

+0

O类型行具有2016年发生? (<2016-01-01) –

+0

[不良习惯踢:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick- using-old-style-joins.aspx) - 在ANSI-** 92 ** SQL标准中,旧式*逗号分隔的表*样式列表已替换为* proper * ANSI'JOIN'语法超过20年前**),其使用不鼓励 –

回答

2

你也许可以做到这一点使用一些CTE的和UNION ALL

;WITH TypeF AS 
(
    -- F type rows with a date bigger than 2016-01-01 
    SELECT * FROM [FTG1].[dbo].[oof] WHERE [type] = 'F' and [date] >= '2016-01-02' 
), 
TypeO AS 
(
    -- O type rows which has happened under year 2015 
    SELECT * FROM [FTG1].[dbo].[oof] WHERE [type] = 'O' and YEAR([date]) = 2015 
) 

--get only F type rows with matching O type records 
SELECT * 
FROM TypeF 
WHERE [connection1] IN (SELECT [docnr] 
          FROM  TypeO) 
UNION ALL 

--get only O type rows with matching F type records 
SELECT * 
FROM TypeO 
WHERE [connection2] IN (SELECT [docnr] 
          FROM  TypeF) 
+0

@ JaimeD77没有想到CTE的感谢把我踢向正确的方向。 – 8bitcat

+1

看起来不错,但如果你没有正确的索引,两张临时表可能会更好。 –

+1

如果可能的话,我一定会将它转换为使用临时表,即使有索引也是如此 – JamieD77

0

我认为你可以得到一个查询的结果与类似下面

SELECT * 
FROM [FTG1].[dbo].[oof] 
where 
(YEAR(subq1.orddatum) = '2015' AND YEAR(subq1.faktdatum) = '2016') 
AND 
(doknr = koppl_dok2 OR doknr = koppl_dok1) 
相关问题