2009-09-23 4 views
0

я не помню, как присоединиться к столу к себе .. мой стол:Выравнивание по левому краю на одной и той же таблице

| id | proc | value | kind | 
| 1 | 1 | foo | a | 
| 2 | 1 | bar | b | 
| 3 | 2 | some | a | 

И мне нужно, чтобы получить седловины значение где прок составляет $ прок и вид одновременно " а»и„б“.. ну, мне нужно есть, что (ищет прок = 1):

| v_a | v_b | 
| foo | bar | 

Так я написал этот вопрос:

SELECT 
    a.value AS v_a, 
    b.value AS v_b 
FROM 
    (SELECT value FROM table WHERE proc = '1' AND kind = 'a') AS a, 
    (SELECT value FROM table WHERE proc = '1' AND kind = 'b') AS b 

и работает, но на Если в таблице у меня есть две строки для вида = a и kind = b.

Но мне нужно, что если пропустить строку, я буду иметь нулевое значение: если я смотрю на прок = 2 я должен получить:

| v_a | v_b | 
| foo | NULL| 

Вместо этого с моим запросом я не получаю anythong если b или строка отсутствует.

Im работает с mysql ... Как это сделать?

Edit: Я мог бы использовать предложение UNION, но это не позволит мне иметь значение NULL, когда одна строка отсутствует (вид = а или вид = б)

ответ

1

вы должны сделать полное объединение в случае прок существует «а», но не «B» или наоборот:

SELECT 
    a.value v_a, 
    b.value v_b 
FROM (SELECT proc, value FROM tab WHERE kind = 'a') a LEFT JOIN 
(SELECT proc, value FROM tab WHERE kind = 'b') b 
    ON a.proc = b.proc 
WHERE a.proc = '1' 
UNION 
SELECT 
    a.value v_a, 
    b.value v_b 
FROM (SELECT proc, value FROM tab WHERE kind = 'b') b LEFT JOIN 
(SELECT proc, value FROM tab WHERE kind = 'a') a 
    ON a.proc = b.proc 
WHERE b.proc = '1' 

EDIT : первый дал MS запрос SQL Server (ПОЛНЫЙ JOIN), но, видимо, это не поддерживается MYSQL, поэтому я изменил его на UNION 2 LEFT JOIN

+0

Идеологически это то, что мне нужно, но я получаю ошибку рядом с ПОЛНЫМ ПРИСОЕДИНЕНИЕМ .. поддерживает ли mysql полное соединение? – Strae

+0

Я изменил запрос в UNION из 2 LEFT JOIN. – manji

+0

И у нас есть победитель! Оно работает. Но его сложность выглядит как предупреждение неправильного определения моих таблиц db, я снова проверю свою структуру, если есть более простой и быстрый способ. Спасибо человеку! – Strae

0

select * from t1 full outer join t2 on some_id = some_other_id?

+0

Doesnt работа .... – Strae

1

Я пропустил вашу потребность в получении NULL. Это сложно, но это, кажется, работает:

SELECT 
    a.value AS a_val, 
    (SELECT value FROM t b2 WHERE b2.proc = a.proc AND b2.id != a.id) AS b_val 
FROM `t` a 
WHERE a.kind = 'a' 

UNION DISTINCT 

SELECT 
    (SELECT value FROM t a2 WHERE a2.proc = b.proc AND a2.id != b.id) AS a_val, 
    b.value AS b_val 
FROM `t` b 
WHERE b.kind = 'b' 
+0

Это решение тоже работает, спасибо ! – Strae

0
SELECT 
    a.value AS v_a, 
    b.value AS v_b 
FROM 
    (SELECT proc, value FROM table WHERE proc = '1' AND kind = 'a') AS a 
LEFT OUTER JOIN 
    (SELECT proc, value FROM table WHERE proc = '1' AND kind = 'b') AS b 
ON a.proc=b.proc 
Смежные вопросы