SQL Server Set на основе разделения между наборами? - PullRequest
0 голосов
/ 31 июля 2011

У меня есть три таблицы, и я пытаюсь определить, имеют ли значения CountCol в @tableA, разделенные на значения CountCol в @tableB, чистый остаток значений CountCol от @tableC. Из таблицы ниже приведен набор результатов, показывающий одну строку с 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 ]

1 голос
/ 01 августа 2011

Вы не сказали это, но я собираюсь догадаться, что вы хотите, чтобы 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 и c для одной строки в a, то может быть гораздо эффективнее заменить /* Add mod check here? */ на:

      AND a.KeyCol % b.KeyCol = 0

Однако, если все соединения 1-1, это, скорее всего, будет медленнее, а не быстрее.

1 голос
/ 31 июля 2011

Это было бы медленно для больших таблиц, но, вероятно, нет лучшего способа:

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, которое является их произведением.

...