2013-02-25 3 views
0

мне нужно присоединиться следующие 2 таблицы на колонке DbName:SQL - Присоединяются таблицы, основанные на условиях

Таблица A

ProductName DbName ServerName 
A   DB1 sername 
B   DB2 sername 
C   DB3 sername 
D   DB3 sername 

Таблица B

ID DBName ObjectName 
1 DB3 objC 
2 DB2 objD 
3 DB3 objD 
4 DB1 objD 

Так что я могу получить окончательный стол со следующими колонками (т.е. все столбцы таблицы B + Наименование продукта):

ID DBName ObjectName ProductName 

Как видно из таблицы A, у меня есть DB3, относящийся к 2 различным ProductName (C и D), что приводит к соединению многих-многих (т. если col имеет DB3 после объединения, он превращается в 2 строки, один из которых отображает C в ProductName, а другой - D.)

Что я хотел бы сделать, так это получить соотношение 1-1 по условиям, если ObjectName является ObjD, то ProductName является D и если ObjectName является ObjC то ProductName является C.

Был бы признателен, если кто-то может мне точку в правильном направлении, чтобы идти об этом ...

Спасибо !!

+0

Re: «если ObjectName - ObjD, то ProductName - D»: не исключает ли это строк с ID = 2 и ID = 4? – ruakh

+0

Где бы я поместил это в код? Должно быть где-то рядом с объединениями? –

+0

Почему вы не публикуете свой желаемый результат? Это поможет прояснить, что вы хотите. – ruakh

ответ

2
SELECT a.*, b.ProductName 
FROM tableB a 
     INNER JOIN tableA b 
      ON a.DBName = b.DbName AND 
       a.ObjectName LIKE '%' + b.ProductName 

Приведенный выше запрос работает, как ожидалось, но, безусловно, имеют низкую производительность. Он будет выполнять FULL TABLE SCAN, потому что он не использует и не индексирует.

Пожалуйста, нормализуйте свои таблицы, чтобы поиск использовал индекс.

Вот предложил схему:

TableA

  • ProductName
  • DbName
  • ServerName

TableB

  • ID
  • DBName
  • ObjectName
  • ProductName

и определить индекс coumpundcolumn на ProductName, DbName на обеих таблицах.

+0

Большое спасибо JW! Я отдам его. Я новичок в SQL - нормализовать таблицы, что означает создание индексов для каждого из них? –

+0

Схема, что у меня сейчас есть? Добавление ProductName в TableB - именно то, чего я пытаюсь достичь в этом посте! –

+0

Хорошо, спасибо, я дам ему трещину благодаря помощнику! –

2

Это уродливое. (и может замедляться). Вы должны использовать целые идентификаторы для соединения.

Для таблиц было бы:

SELECT b.ID, b.DBName, b.ObjectName, a.ProductName 
FROM a 
    JOIN b 
    ON a.DBName = b.DBName 
    AND CONCAT('%',a.ProductName) LIKE b.ObjectName 

Я надеюсь, что это работает.

+0

Большое спасибо - я дам тому назад. Что такое целые идентификаторы? –

+0

Извините. Для SQL Server вам, похоже, нужно заменить 'CONCAT ('%', a.ProductName)' на ''% '+ a.ProductName'. –

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