2016-06-08 1 views
0

У меня есть таблица вроде этого:SQL: сделать фиктивные строки

a1 b1 
a1 b2 
a2 b2 
a2 b3 

И я хочу сделать фиктивный rows'to есть результат:

a1 b1 1 
a1 b2 1 
a1 b3 0 
a2 b1 0 
a2 b2 1 
a2 b3 1 

Я сделал ПРИСОЕДИНИТЕСЬ, но это займет слишком много времени, потому что у меня на столе 1,4 М строк, у кого есть идея?

+1

Какие RDBMS (поставщика и версии)? Вам нужна * каждая с каждым и посмотреть, что эта пара существует *? Существует ли какая-либо таблица каталогов со всеми существующими значениями a или b или вы берете все реально существующие значения без дубликатов? – Shnugo

ответ

0

Это был подход с синтаксисом SQL Server

DECLARE @dummyTable TABLE(aValue VARCHAR(10),bValue VARCHAR(10)); 
INSERT INTO @dummyTable VALUES 
('a1','b1') 
,('a1','b2') 
,('a2','b2') 
,('a2','b3'); 

WITH DistinctA AS 
(SELECT DISTINCT aValue FROM @dummyTable) 
,DistinctB AS 
(SELECT DISTINCT bValue FROM @dummyTable) 
SELECT a.aValue 
     ,b.bValue 
     ,CASE WHEN EXISTS(SELECT 1 
         FROM @dummyTable AS dt 
         WHERE dt.aValue=a.aValue AND dt.bValue=b.bValue) THEN 1 ELSE 0 END AS Existing 
FROM DistinctA AS a 
CROSS JOIN DistinctB AS b 
ORDER BY a.aValue,b.bValue