集合中基于SQL Server集的划分?

时间:2011-07-31 05:20:08

标签: sql-server math division

我有三个表,我试图确定@tableA中的CountCol值除以@tableB中的CountCol值是否具有来自@tableC的干净剩余的CountCol值。从我下面的表格中,我只有一个结果集显示KeyCol为100的一行。我可能会想到这个错误,有人可以帮忙吗?

感谢。

Declare @tableA Table ( KeyCol Int , CountCol Int )
Declare @tableB Table ( KeyCol Int , CountCol Int )
Declare @tableC Table ( KeyCol Int , CountCol Int )
Insert Into @tableA Values ( 100 , 12 )
Insert Into @tableA Values ( 101 , 11 )
Insert Into @tableB Values ( 100 , 3 )
Insert Into @tableB Values ( 101 , 3 )
Insert Into @tableC Values ( 100 , 4 )
Insert Into @tableC Values ( 101 , 4 )

2 个答案:

答案 0 :(得分:1)

这对大表来说会很慢,但可能没有更好的方法:

SELECT
    A.KeyCol AS A_KeyCol,
    A.CountCol AS A_CountCol,
    B.KeyCol AS B_KeyCol,
    B.CountCol AS B_CountCol,
    C.KeyCol AS C_KeyCol,
    C.CountCol AS C_CountCol
FROM B
CROSS JOIN C
INNER JOIN A ON A.CountCol = B.CountCol * C.CountCol

它查看B和C中每个值的组合,并检查A中是否有一个值是他们的产品。

答案 1 :(得分:1)

你没有说过,但我猜你想要KeyCol也匹配。如果是这样,那么以下内容应该有效:

SELECT
FROM A
  JOIN B
    ON a.KeyCol = b.KeyCol
      /* Add mod check here? */
  JOIN C
    ON a.KeyCol = c.KeyCol
WHERE a.CountCol = b.CountCol + C.CountCol

如果b中的单行可以包含ca中的多行,那么将/* Add mod check here? */替换为 AND a.KeyCol % b.KeyCol = 0 可能效率更高:

{{1}}

但是如果连接都是1-1,那么这可能会更慢,而不是更快。