0

同じ列の一連の条件に一致するすべての行を取得したいと思います。しかし、すべての条件が良好な場合にのみ行が必要であり、1 つの条件のみが失敗した場合は行が必要ありません。たとえば、次の表を使用します。

|ID|名前|
----------
|1 |トト|
|2 |タタ|

この表に「タタ」&&「トト」があればリクエストできるようにしたいです。ただし、「tata」と「tuto」が含まれているかどうかを尋ねるとき、「toto」と「tutu」がテーブルに含まれているかどうかを尋ねるなど、引数のいずれかがテーブルに含まれていない場合は空の応答が必要です。どうやってやるの ?現在、引数ごとに 1 つのクエリを実行していますが、これはあまり効率的ではありません。subselect または group+having を含むいくつかのソリューションを試しましたが、誰も思い通りに機能していません。

ご協力ありがとうございました !乾杯

4

4 に答える 4

1

これは少しあいまいです。名前が一意の場合、where 句に一致する一致する行を数えることができます。

where name='toto' or name='tata'

カウントが 2 の場合、両方が一致したことがわかります。name が一意でない場合、ユニオン内のそれぞれに一致する最初の ID (上位 1 つの ID を選択 ...) を選択し、それらを外側の選択でカウントする可能性があります。

任意の数の一致する名前がある場合でも、select ステートメントの作成に使用しているトップレベル言語でストアド プロシージャまたはコードを作成できます。

于 2011-11-07T05:20:41.430 に答える
1

これは最も効率的な方法ではありませんが、このクエリは機能します。

SELECT * FROM table_name 
WHERE (name = 'toto' OR name = 'tata') 
AND ( SELECT COUNT(*) FROM table_name WHERE name = 'toto') > 0 
AND ( SELECT COUNT(*) FROM table_name WHERE name = 'tata') > 0
于 2011-11-07T05:36:22.680 に答える
0
SELECT 1 AS found FROM hehe
WHERE 1 IN (SELECT 1 FROM hehe WHERE name='tata')
  AND 1 IN (SELECT 1 FROM hehe WHERE name='toto')
于 2011-11-07T05:24:05.640 に答える
0

が一意である場合nameは、次のように簡略化できます。

SELECT *
FROM   tbl
WHERE  name IN ('toto', 'tata')
AND    (SELECT count(*) FROM tbl WHERE name IN ('toto', 'tata')) > 1;

そうでない場合:

SELECT *
FROM   tbl
WHERE  name IN ('toto', 'tata')
AND    EXISTS (SELECT * FROM tbl WHERE name = 'toto')
AND    EXISTS (SELECT * FROM tbl WHERE name = 'tata');

または、PostgreSQL、MySQL、および場合によってはその他の場合:

SELECT *
FROM   tbl
WHERE  name IN ('toto', 'tata')
AND    (SELECT count(DISTINCT name) FROM tbl WHERE name IN ('toto', 'tata')) > 1;
于 2011-11-07T06:14:19.007 に答える