2012-06-26 2 views
0

У меня две таблицы. Я хочу объединить их вместе, и в одной строке появятся повторяющиеся записи. Ложные структуры таблиц приведены нижеSQL Выберите несколько строк в одну отображаемую строку

MainTbl Cols: MKey1, MKey2, MData1, MData2, MData3

SuppTbl Cols: SPrimaryKey, SKey1, SKey2, SData1, SData2

Я хочу LEFT JOIN MainTbl к SuppTbl. Однако SuppTbl содержит дубликаты комбайнового ключа SKey1 и SKey2.

Результаты, которые я хочу, ниже, где «- #» указывает номер дублирования.

MKey1, MKey2, MData1, MData2, MData3, SData1-1, SData2-1, SData1-2, SData2-2

В сущности, все поля из объединения должны содержать по одной строке на основе один Key1 и Key2.

ПОПЫТКИ ОТВЕТ НА ШОН W

SELECT 
    MainTbl.MKey1, 
    MainTbl.MKey2, 
    tcd.SData1 AS SData11, 
    tcd.SData2 AS SData22, 
    tcr.SData1 AS SData12, 
    tcr.SData2 AS SData22 
FROM MainTbl 
LEFT JOIN SuppTbl tcd 
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2 
LEFT JOIN SuppTbl tcr 
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2 
WHERE tcd.SData1 < tcr.SData1 

РЕЗУЛЬТАТ успеха. Не делал никаких записей.

+0

В таблице 2 не более двух совпадений? – Tony

+0

@tony Не обязательно. У него может быть один или два. Если у него больше, это редкий случай, но возможно. У меня есть условия, которые могут ограничить его двумя. «WHERE DataD1 = 4» и «WHERE DataD1 = 22» – steventnorris

+0

Какой вкус SQL вы используете? – Tony

ответ

2

Найден ответ. Я немного упростил это для простоты, но он отлично работает, пока есть условия, которые могут быть применены, как есть в моем случае.

SELECT 
    MainTbl.MKey1, 
    MainTbl.MKey2, 
    tcd.stat AS SData11, 
    tcr.stat AS SData12 
FROM MainTbl 
LEFT JOIN(
    SELECT * FROM SuppTbl WHERE SData1 <> 22 
) tcd 
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2 
LEFT JOIN(
    SELECT * FROM SuppTbl WHERE SData1 = 22 
) tcr 
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2 
+0

Вы действительно должны были предоставить дополнительную информацию о том, что хранилище SData1, и как это повлияет на выбор строк. – Sean

+0

, где из-за этого выскочил '22'? – whytheq

+0

@whytheq 22 был ответом на вопрос, который спросил Тони в комментариях ОП. – steventnorris

4

Пересмотренные (комментарии после):

CREATE TABLE MainTbl (MKey1 int,MKey2 int,MData1 varchar(10),MData2 varchar(10),MData3 varchar(10)) 
CREATE TABLE SuppTbl (SPrimaryKey int,SKey1 int,SKey2 int,SData1 varchar(10),SData2 varchar(10)) 

INSERT INTO MainTbl VALUES (1, 1, '1MData1', '1MData2', '1MData3') 
INSERT INTO SuppTbl VALUES (1, 1, 1, '1SData1-1', '1SData2-1') 
INSERT INTO SuppTbl VALUES (2, 1, 1, '1SData1-2', '1SData2-2') 

INSERT INTO MainTbl VALUES (1, 2, '2MData1', '2MData2', '2MData3') 
INSERT INTO SuppTbl VALUES (3, 1, 2, '2SData1-1', '2SData2-1') 

SELECT 
    MainTbl.MKey1, 
    MainTbl.MKey2, 
    tcd.SData1 AS SData11, 
    tcd.SData2 AS SData22, 
    tcr.SData1 AS SData12, 
    tcr.SData2 AS SData22 
FROM MainTbl 
INNER JOIN SuppTbl tcd 
ON MainTbl.MKey1=tcd.SKey1 AND MainTbl.MKey2=tcd.SKey2 
LEFT JOIN SuppTbl tcr 
ON MainTbl.MKey1=tcr.SKey1 AND MainTbl.MKey2=tcr.SKey2 
AND tcd.SPrimaryKey < tcr.SPrimaryKey 

Теперь это не будет работать 100% для тех случаев, когда у вас есть 2 строки в SuppTbl: это даст два строки результата - один будет хорошо, а другой вы захотите исключить. Чтобы исключить его, вы должны предоставить дополнительную информацию о том, как идентифицировать те экземпляры, в которых будет> 1 строка SuppTbl. Вы упомянули выше в комментариях «WHERE Data1 = 4». Так что это должно быть частью предложения WHERE. Это было бы примерно так:

WHERE tcd.SData1 = 4 

Это может затем исключить единственную строку SuppTbl. Поэтому вам нужно предоставить информацию о том, как НЕ отфильтровывать эту строку. Возможно:

WHERE tcd.SData1 IN (4, 22) 

(Это не будет работать с данными в таблицах выше).

+0

Я попробовал ваш ответ (отправил попытку выше), но нет записи были вытащены. Может быть, это одно из предположений? Какая информация может помочь вам лучше понять мою структуру? – steventnorris

+0

Посмотрел назад на ваш ответ, и на самом деле это то место, где я получил свое направление от окончательных решений. Извиняюсь, если я не даю кредит, когда должен был быть кредит. – steventnorris

Смежные вопросы