1

そのため、クエリから適切なデータを取得する際に問題が発生しています。

私は次のテーブルを持っています(人):

Name  |       xpath        |   value
Derek |  /body/torso/arm   |   left
Derek |  /body/torso/arm   |   right
Derek |  /body/torso/neck  |   Head
Ron   |  /body/torso/neck  |   Head
Ron   |  /body/torso/arm   |   left

つまり、基本的に私が取得しようとしたクエリ結果は、違い(2人の間に何が欠けているか)を示すことでした。

results:
Name1 |       xpath1       |   value1   | Name2  |   xpath2         |   value2
Derek |  /body/torso/arm   |   right    | Ron    |    NULL          |   NULL

私も次のものを取り戻すことで大丈夫でしょう

results:
Name1 |       xpath1       |   value1   | Name2  |   xpath2         |   value2
Derek |  /body/torso/arm   |   right    | Ron    |    NULL          |   NULL
Derek |  /body/torso/arm   |   left     | Ron    | /body/torso/arm  |   left  
Derek |  /body/torso/neck  |   Head     | Ron    | /body/torso/neck |   Head    

私が使用していたクエリは次のとおりです。

SELECT P.Name , P.xpath, P.value, P1.Name, P2.xpath, P3.value
FROM Person as P
LEFT OUTER JOIN
    Person as P2 ON P.xpath = P2.xpath
WHERE
         P.Name = "Derek"
    AND  P2.Name = "Ron"

私が何を試しても、基本的に重複するデータが得られますが、実際に探しているものは決してありません。単純なものが欠落しているか、単に間違っているようです。助言がありますか?最終的にはこれをSPROCで実行しますが、2つだけでなく、Derek、Ron、John、Dawnなどの複数の名前を処理できると便利です。

4

2 に答える 2

2

これを試してみてください:

SELECT    a.Name  AS Name1,
          a.xpath AS xpath1,
          a.value AS value1,
          'Ron'   AS Name2,
          b.xpath AS xpath2,
          b.value AS value2
FROM      Person a
LEFT JOIN Person b ON b.Name = 'Ron'
                  AND a.xpath = b.xpath 
                  AND a.value = b.value
WHERE     a.Name = 'Derek' AND
          b.Name IS NULL

SQLFiddleデモ


Derekを複数の名前と比較したい場合はCROSS JOIN、すべての名前を比較して(名前が結果セットに表示されるように)、LEFT JOIN同じテーブルxpathで、、、および:valueで指定された名前を使用できます。CROSS JOIN

SELECT     a.Name  AS Name1,
           a.xpath AS xpath1,
           a.value AS value1,
           b.Name  AS Name2,
           c.xpath AS xpath2,
           c.value AS value2
FROM       Person a
CROSS JOIN (
           SELECT 'Ron' AS Name UNION ALL
           SELECT 'John'        UNION ALL
           SELECT 'Charles'     UNION ALL
           SELECT 'Aaron'
           ) b
LEFT JOIN  Person c ON b.Name  = c.Name 
                   AND a.xpath = c.xpath
                   AND a.value = c.value
WHERE      a.Name = 'Derek' AND
           c.Name IS NULL

SQLFiddleデモ


また、比較の左側に(「Derek」だけでなく)複数の名前を付けたい場合は、変更するだけです。

a.Name = 'Derek'

a.Name <> b.Name

上記のクエリで。


SQLFiddleデモ


編集:それをさらに進めるために:

すべての名前をすべての名前と比較します。

SELECT     a.Name  AS Name1,
           a.xpath AS xpath1,
           a.value AS value1,
           b.Name  AS Name2,
           c.xpath AS xpath2,
           c.value AS value2
FROM       Person a
CROSS JOIN (SELECT DISTINCT Name FROM Person) b
LEFT JOIN  Person c ON b.Name  = c.Name 
                   AND a.xpath = c.xpath
                   AND a.value = c.value
WHERE      a.Name <> b.Name AND 
           c.Name IS NULL
于 2012-08-16T17:36:20.370 に答える
0

EXCEPTユニオンを使用してみてください。

WITH tbl (name, xpath, value) as
    (values
        ('Derek','/body/torso/arm','left'),
        ('Derek','/body/torso/arm','right'),
        ('Derek','/body/torso/neck','Head'),
        ('Ron','/body/torso/neck','Head'),
        ('Ron','/body/torso/arm','left')
    )
SELECT xpath, value 
FROM tbl 
WHERE name = 'Derek'
    EXCEPT
        SELECT xpath, value 
        FROM tbl 
        WHERE name = 'Ron'
于 2012-08-16T18:15:28.267 に答える