1

このテーブルを持っている(申し訳ありませんが、ここでまともなレイアウトを取得することはできません):

PD      Header         Text              Mask_Producer      Mask_Dep        Mask_Diam
----------------------------------------------------------------------------------------------
10      Producer       Aproducer         Aprod              *               *
10      Producer       Bproducer         Bprod              *               *
20      Diam           A                 Aprod              10              30
20      Diam           A                 Aprod              20              40
20      Diam           B                 Aprod              10              40
30      Dep            10                Aprod              10              *
30      Dep            20                Aprod              20              *
30      Dep            30                Aprod              30              *
20      Diam           A                 Bprod              20              40
30      Dep            10                Bprod              10              *

テーブル内の行を、他の行を選択するためのフィルター/マスクとして使用しています。

したがって、ユーザーはすでに次の行を選択しています。

PD   Text
-------------
10   Aproducer
20   A

ここで、PD=30の行がこれらの以前の選択に適合するかどうかを調べたいと思います。

PD = 10、Text = Aproducerは、Mask_Producerは "Aprod"でなければならないことを示しています(Mask_DepとMask_Diamは星によって何でも許可されています)

PD = 20、Text = Aは、Mask_Producerが "Aprod"であり、Mask_Depが10または20であり、Mask_Diamが30または40(またはスター)である必要があることを示します。

結果を上の表の6行目と7行目にしたいと思います。

次に、2000行と20個のMask_xxフィールドを持つこの例を想像してみてください。

これを行うには、IN、LEFT JOIN、JOIN、および一時テーブルなどのSQLを考えていますが、複雑になりすぎている可能性があります。

4

3 に答える 3

1

私はあなたが何を求めているかは理解していると思いますが、私はSQL Serverに精通しているので、構文が少しずれている場合はご容赦ください。内部結合を実行して、テーブルをそれ自体に結合し、必要な結果を得ることができるはずです。

SELECT *
FROM tbData A
JOIN tbData B ON A.PD = B.Mask_Dep AND A.Mask_Producer=B.Mask_Producer
WHERE A.PD = 10
    AND A.Text='Aproducer'
UNION
SELECT *
FROM tbData A
JOIN tbData B ON A.PD = B.Mask_Dep AND A.Mask_Producer=B.Mask_Producer
WHERE A.PD = 20
    AND A.Text='A'

これを見ると、私は少しずれていると思いますが、あなたのデータのいくつかは明確ではありません。Mask_DepとMask_Diamで探しているものについて、より普遍的なルールを教えていただけますか?

于 2010-01-19T23:13:09.867 に答える
1

私はあなたがこのようなものが欲しいと思います:

SELECT r.* FROM table AS c -- choices
JOIN table AS r            -- results
    ON (
        (r.mas_dep = '*' OR c.mask_dep = r.mask_dep)
        AND
        (r.mask_diam = '*' OR c.mask_diam = r.mask_diam)
    )
WHERE (
    ( c.pd = 10 AND c.text = 'Aproducer' )
    OR ( c.pd = 20 AND c.text = 'A' )
)
AND r.PD = 30

これは、選択の結果を取得します。

PD      Header         Text         Mask_Producer   Mask_Dep    Mask_Diam
10      Producer       Aproducer    Aprod           *           *
20      Diam              A         Aprod           10          30
20      Diam              A         Aprod           20          40

そして、これらの条件が当てはまるマスターテーブルに対して自己結合しr.mas_dep = '*' OR c.mask_dep = r.mask_depますr.mask_diam = '*' OR c.mask_diam = r.mask_diam。これにより、次のセットが返されます。

PD      Header         Text         Mask_Producer   Mask_Dep    Mask_Diam
30      Dep              10         Aprod           10          *
30      Dep              20         Aprod           20          *

30のmask_depsが選択結果セットに含まれていないため、他の行を明確に除外し、30ではない行pdsを除外します。

于 2010-01-19T23:13:24.983 に答える
0

これは私が使用するコードのタイプであり、機能しますが、条件とフィールドを追加すると、より大きな結合が得られ、各結合でより多くのAND .. OR ... ORシーケンスが得られるため、改善のための提案を歓迎します。 !!特に私は、データが増大するにつれてこれが遅くなる可能性があると考えていますか?SQLサーバーが私のコードに対して何をしなければならないかについての分析も歓迎します!

現在、約30の基準/フィールドと、SQLクエリを生成するPHPコードがいくつかあります。

しかし、ここに原理のより小さな例があります:

SELECT DISTINCT t30.*
FROM
  (SELECT *
   FROM YourTable
   WHERE PD = 10
     AND Text = 'Aproducer') AS t10
JOIN
  (SELECT *
   FROM YourTable
   WHERE PD = 20 AND Text = 'A') AS t20 ON 
     (t20.MaskProducer = t10.MaskProducer
                                OR t20.MaskProducer = '*'
                                OR t10.MaskProducer = '*')
     AND (t20.MaskDep = t10.MaskDep
                                OR t20.MaskDep = '*'
                                OR t10.MaskDep = '*')
     AND(t20.MaskDiam = t10.MaskDiam
                                OR t20.MaskDiam = '*'
                                OR t10.MaskDiam = '*')
//more JOINS like the one above for each criteria
// below the final join to get the result from
JOIN
  (SELECT *
   FROM YourTable
   WHERE PD = 30) AS t30 ON 
       (t30.MaskProducer = t20.MaskProducer
                             OR t30.MaskProducer = '*'
                             OR t20.MaskProducer = '*')
        AND (t30.MaskDep = t20.MaskDep
                             OR t30.MaskDep = '*'
                             OR t20.MaskDep = '*')
        AND (t30.MaskDiam = t20.MaskDiam
                             OR t30.MaskDiam = '*'
                             OR t20.MaskDiam = '*');
于 2010-02-08T12:04:13.497 に答える