2010-02-16 3 views
0

здесь является структура: -/ alt text http://s004.radikal.ru/i207/1002/79/ed7ac0a97d0b.jpg Так мне нужно выбрать ID и имена из CfgListGroupParIzm для CfgIzmeritel с использованием типа и где ForRun - Ложные этоВыберите группы. Случай ForRun?

SELECT A.ID_ListGroupParIzm, A.Name 
FROM CfgListGroupParIzm A, CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND [email protected]_Izmerit AND A.ForRun=0 

И ID и NamePoint (от CfgIzmerPoint) + Имя из CfgListGroupParIzm с той же CfgIzmeritel где ID_Izmerit от CfgIzmeritel = ID_Izmerit из CfgIzmerPoint и ForRun от CfgListGroupParIzm - Правда

так, наконец, мне нужно что-то вроде

SELECT A.ID_ListGroupParIzm, A.Name 
FROM CfgListGroupParIzm A, CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND [email protected]_Izmerit AND A.ForRun=0 

UNION -- ?? 

SELECT A.ID_ListGroupParIzm, (C.Name + A.Name) AS Name 
FROM CfgListGroupParIzm A, CfgIzmeritel B, CfgIzmerPoint C 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND [email protected]_Izmerit AND A.ForRun=1 
AND [email protected]_Izmerit 

Я думаю, что нужно использовать другие конструкции без Союза, потому что я делаю в основном то же самое в обоих выбирает: -/

ответ

1

Вы можете использовать UNION ALL

SELECT A.ID_ListGroupParIzm, A.Name 
FROM CfgListGroupParIzm A, 
     CfgIzmeritel B 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND  [email protected]_Izmerit 
AND  A.ForRun=0 
UNION ALL 
SELECT A.ID_ListGroupParIzm, 
     (C.Name + A.Name) AS Name 
FROM CfgListGroupParIzm A, CfgIzmeritel B, CfgIzmerPoint C 
WHERE A.ID_TypeIzmerit = B.ID_TypeIzmerit 
AND  [email protected]_Izmerit AND A.ForRun=1 
AND  [email protected]_Izmerit 

UNION ALL принесет вернуть все результаты из обоих запросов. Если вам нужен отдельный список, без каких-либо дубликатов, используйте UNION.

Посмотрите Union vs. Union All

и SQL UNION Operator

Пожалуйста, помните, что с помощью других, чем A, B, C и т.д. псевдонимами является более целесообразным. Попробуйте использовать несколько более описательные псевдонимы, которые упростят выполнение в более крупных запросах.

Если мое предположение верно, что CfgIzmeritel и CfgIzmerPoint являются 12:59 вы могли бы попробовать это с помощью

SELECT grp.ID_ListGroupParIzm, 
    CASE 
     WHEN ForRun=1 AND pnt.ID_TypeIzmerit IS NOT NULL THEN (C.Name + A.Name) 
     ELSE grp.Name 
    END AS Name 
FROM CfgListGroupParIzm grp INNER JOIN 
     CfgIzmeritel item ON grp.ID_TypeIzmerit = item.ID_TypeIzmerit LEFT JOIN 
     CfgIzmerPoint pnt ON grp.ID_TypeIzmerit = pnt.ID_TypeIzmerit 
WHERE [email protected]_Izmerit 

С где п вы должны быть в состоянии игнорировать ForRun, так как это будет использоваться только в Оператор CASE.

Я считаю, что для чтения вы должны использовать UNION/UNION ALL и только попытаться создать один запрос, если производительность плохая (после того как вы посмотрели на индексы).

+0

согласен с псевдонимами, но какие различия между профсоюзом и союзом все здесь? .. есть какой-то способ сделать это одним выбором. , , – Cynede

+0

Из того, что я вижу во втором запросе, у вас есть отношения 1 к 1 между CfgIzmeritel и CfgIzmerPoint (я не вижу присоединения к этому утверждению для CfgIzmerPoint), поэтому для ForRun = 1 вы применяете INNER JOIN, тогда как вы не делая это в первом запросе. Это затрудняет создание в одном запросе. –

+0

не один к одному, есть много точек на одном CfgIzmeritel ... и я думаю, что мне также нужно выбрать здесь их ID или null, если это CfgIzmeritel, также у CfgIzmerPoint нет ID_TypeIzmerit. , , – Cynede

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