0

テーブルをそれ自体に結合する方法を覚えていません。私のテーブルは次のとおりです。

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

そして、procが$ procで、kindが'a'と'b'の両方である値colを取得する必要があります。まあ、それを行う必要があります(proc = 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

そして動作しますが、テーブルにkind=aとkind=bの両方の行がある場合に限ります。

しかし、行を見逃した場合はnull値になる必要があります。proc= 2を探す場合は、次を取得する必要があります。

| v_a | v_b |
| foo | NULL|

代わりに、私のクエリでは、bまたは行が欠落している場合は何も取得しません。

私はmysqlを使用しています...それを行う方法は?

編集: UNION句を使用することはできますが、これでは、1つの行が欠落している場合(kind=aまたはkind=b)にNULL値を指定できません。

4

4 に答える 4

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'
于 2009-09-23T08:49:16.557 に答える
1

proc が 'a' には存在するが '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'

編集:最初にMS SQL Serverクエリ(FULL JOIN)を指定しましたが、明らかにMYSQLではサポートされていないため、2つのLEFT JOINのUNIONに変更しました

于 2009-09-23T08:50:40.347 に答える
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
于 2009-09-23T10:46:08.287 に答える
0

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

于 2009-09-23T08:35:33.153 に答える