Проблема с SQL-запросом с декартовым произведением - PullRequest
2 голосов
/ 12 ноября 2008

Я борюсь с созданием запроса. Это связано с большой и сложной базой данных, но ради этой статьи я свел проблему к чему-то более простому.

У меня есть три таблицы X, Y, Z, определенные как

CREATE TABLE [dbo].[X](
  [ID] [bigint] NOT NULL
)

CREATE TABLE [dbo].[Y](
  [ID] [nchar](10) NOT NULL
)

CREATE TABLE [dbo].[Z](
  [IDX] [bigint] NOT NULL,
  [IDY] [nchar](10) NOT NULL
)

Они содержат следующие данные

Table X    Table Y    Table Z
ID         ID         IDX  IDY
--         --         ---  ---
1          A          1    A         
2          B          1    B         
3          C          1    A

Я хочу создать запрос, который даст следующий результат

Count  IDX  IDY
=====  ===  ===
    2    1    A
    1    1    B
    0    1    C
    0    2    A
    0    2    B
    0    2    C
    0    3    A
    0    3    B
    0    3    C

Моя первоначальная мысль была

SELECT COUNT(*), X.ID, Y.ID
FROM
  X
  CROSS JOIN Y
  FULL OUTER JOIN Z ON X.ID = Z.IDX AND Y.ID = Z.IDY
GROUP BY X.ID, Y.ID

но это оказывается не на том пути.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 12 ноября 2008

Это похоже на работу:

SELECT COUNT(*) AS CNT, IDX, IDY
FROM Z
GROUP BY IDX, IDY
UNION
SELECT 0, X.ID, Y.ID
FROM X, Y
WHERE NOT EXISTS (
    SELECT * FROM Z WHERE Z.IDX = X.ID AND Z.IDY = Y.ID
)
ORDER BY CNT DESC
1 голос
/ 12 ноября 2008
SELECT
    (SELECT COUNT(*) FROM Z WHERE IDX = X.ID AND IDY = Y.ID),
    X.ID,
    Y.ID
FROM
    X,Y

Это ваш ответ ... почему вы, возможно, хотите этот запрос, без понятия:)

0 голосов
/ 12 ноября 2008
SELECT (SELECT(COUNT(*) FROM Z) AS COUNT, X.ID AS IDX, y.ID AS IDY
FROM X CROSS JOIN Y 
ORDER BY 1 DESC, 2, 3
0 голосов
/ 12 ноября 2008
SELECT
  COUNT(z.idx) count,
  x.id idx,
  y.id idy
FROM
  (x CROSS JOIN y)
  LEFT JOIN z ON z.idx = x.id AND z.idy = y.id
GROUP BY
  x.id,
  y.id
ORDER BY
  COUNT(z.idx) DESC,
  x.id,
  y.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...