2011-02-15 87 views
0

我有2个需要加入大量数据的表。问题在于2个表大部分保持相同的数据,并且连接有时会产生不希望的,但并不意外。结果。这里有一个例子:在1个表中加入2条记录,在另一个表中记录2条记录以产生2条记录

week_end_date nugly payroll_code rate  hours  check_number 
-------------------------------------------------------------- 
2010-01-17  AU9T8K HRLY-W  13.00000 40.00000 530957    
2010-01-17  AU9T8K HRLY-W  13.00000 40.00000 DD00000105382 

week_end_date nugly trx_number pay_code hours rate 
2010-01-17 AU9T8K ETS00000010771815 HRLY-W 40.00000 13.00000 
2010-01-17 AU9T8K ETS00000010771684 HRLY-W 40.00000 13.00000 

我期待的支票#和trx_number相结合的加盟,但我结束了一个交叉连接,因为一切是我参加的是相同的。对于每一个我喜欢这种情况的人,我真的不在乎trx_number最终与哪个check#相关。

有什么想法?

以下是目前的结果:

week_end_date nugly payroll_code rate hours check_number trx_number 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 DD00000105382   ETS00000010771815 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 530957     ETS00000010771815 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 DD00000105382   ETS00000010771684 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 530957     ETS00000010771684 

我想的是:

week_end_date nugly payroll_code rate hours check_number trx_number 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 DD00000105382   ETS00000010771815 
2010-01-17 AU9T8K HRLY-W 13.00000 40.00000 530957     ETS00000010771684 

在哪里我真的不关心这trx_number是与check_number。

这里是我当前的查询:

SELECT c.week_end_date, c.nugly, c.payroll_code, c.rate, c.hours, c.check_number, t.trx_number 
    FROM checksByNuglyPaycode c 
    LEFT OUTER JOIN trxNumByNuglyPaycode t ON c.db_id = t.db_id AND c.fridate = t.fridate 
     AND c.nugly = t.nugly AND c.trx_type = t.trx_type AND c.payroll_code = t.pay_code 
     AND c.hours = t.hours AND c.rate = t.rate AND c.week_end_date = t.week_end_date 
    WHERE t.db_id = 'lal' AND c.nugly = 'AU9T8K' AND c.payroll_code = 'HRLY-W' 
     AND c.fridate = '2010-01-22' AND c.week_end_date = '2010-01-17' 
ORDER BY c.fridate, c.nugly, payroll_code 

where子句显然是专门为这种情况下,在最后的查询,不会有一个where子句。

+0

你能告诉我们的代码,你试过和预期成绩? – 2011-02-15 22:33:25

+0

请勿在SO上发布内容时使用标签 - 使格式化成为噩梦 – 2011-02-15 22:55:40

+0

对不起,只需复制并粘贴。 – spuppett 2011-02-15 23:03:33

回答

0

这是一个猜测,但你可以使用类似ROW_NUMBER为每个表格创建一个标识字段然后加入他们?

喜欢的东西

CREATE VIEW vwOrderedTable1 
AS 
SELECT ROW_NUMBER() OVER(ORDER BY week_end_date) AS 'RowNumber', 
    week_end_date, 
    nugly, 
    payroll_code... 
FROM Table1 
GO 

CREATE VIEW vwOrderedTable2 
AS 
SELECT ROW_NUMBER() OVER(ORDER BY week_end_date) AS 'RowNumber', 
    week_end_date, 
    nugly, 
    'payroll_code' = pay_code... 
FROM Table2 
GO 

SELECT * 
FROM vwOrderedTable1 
INNER JOIN vwOrderedTable2 ON vwOrderedTable1.RowNumber = vwOrderedTable2.RowNumber 
0

您能否提供更多信息?你目前的查询是什么样的?表格结构如何?你想加入钥匙吗?

你提到你“看”检查#和trx_number ...这些结果?

你有没有一个例子说明你所提供的行会返回什么?


我喜欢Alex的回答,它似乎很稳固。

也许是一个愚蠢的评论,但如果你不关心你得到了什么trx_number,并且在你的示例查询中你使用了一个左连接,这意味着你只想要所有来自checksByNuglyPaycode的数据,为什么你加入两张桌子?你需要两张表的所有数据吗?更像是一个完整的外连接?

因此,如果在checksByNuglyPaycode中有一个不在trxNumByNuglyPaycode中的记录,您需要它吗?

如果在trxNumByNuglyPaycode中有记录,而不在checksByNuglyPaycode中,您需要这样吗?


有趣的是,如果你想从两个表的所有数据,你可以使用下面的选择。注意:它采用独特这将可能是缓慢的,而且我认为全外连接,也可以慢......它已经很长一段时间...

SELECT DISTINCT 
    ISNULL(c.week_end_date, t.week_end_date), ISNULL(c.nugly,t.nugly), 
    ISNULL(c.payroll_code,t.payroll_code), ISNULL(c.rate,t.rate), 
    ISNULL(c.hours, t.hours), c.check_number, t.trx_number 
FROM 
    checksByNuglyPaycode c 
FULL OUTER JOIN 
    trxNumByNuglyPaycode t ON c.db_id = t.db_id 
          AND c.fridate = t.fridate 
          AND c.nugly = t.nugly 
          AND c.trx_type = t.trx_type 
          AND c.payroll_code = t.pay_code 
          AND c.hours = t.hours 
          AND c.rate = t.rate 
          AND c.week_end_date = t.week_end_date 
ORDER BY 
    c.fridate, c.nugly, payroll_code 
+0

这应该被添加为原始问题下的评论,而不是自己的答案:) – 2011-02-15 23:31:07

0

什么像你已经有了作为一个子查询包裹着查询:

SELECT MAX(trx_number), week_end_date, nugly, payroll_code, rate, hours, check_number 
FROM 
(
    QUERY_YOU_ALREADY_HAVE 
) tbl 
GROUP BY week_end_date, nugly, payroll_code, rate, hours, check_number 
相关问题