これ何て呼びますか

http://okwave.jp/qa/q8328454.html
にて解決済みとしてしまいましたが、問題がありました。

クロス結合になってしまい、重複した結果が出力されてしまいます。
1個の結果だと1個の出力ですが、2個の結果だと4個の出力となってしまい、2乗できいてきてしまいます。
ご教示のほど、よろしくお願いいたします。

----------------------------------------------------------------
下記SQL文と同一の結果を出力しつつ、高速化は可能ですか?
ARCHIVE_SAMPLEとARCHIVE_ORDERが大きくなると著しくパフォーマンスが下がります。

ARCHIVE_ORDERにて検索をかけた結果のArchiveIDとOrder_SampleIDが一致するARCHIVE_SAMPLEを出力したいです。
データサイズとしては、ARCHIVE_ORDER<<ARCHIVE_SAMPLEなので、ORDER側で検索しています。

SELECT * FROM ARCHIVE_SAMPLE M WHERE M.ArchiveID IN (SELECT ArchiveID FROM ARCHIVE_ORDER WHERE UPPER(Order_PatientID) LIKE UPPER('%234%')) AND M.Order_SampleID IN (SELECT Order_SampleID FROM ARCHIVE_ORDER WHERE UPPER(Order_PatientID) LIKE UPPER('%234%'))
----------------------------------------------------------------

A 回答 (3件)

前回の回答を転載しておきます。


> SELECT [mの全てのフィールドの列挙]
> FROM Archive_Sample m JOIN Archive_Order o
>     ON m.ArchiveID=o.ArchiveID AND m.Order_Sampleid=o.Order_SampleID
> WHERE UPPER(o.Order_PatientID) LIKE '%234%'

SELECTの後ろにDISTINCTをつけてください。
    • good
    • 0

【ARCHIVE_SAMPLE】


ArchiveID Order_SampleID
1     2
2     1

【ARCHIVE_ORDER】
ArchiveID Order_SampleID
1     1
2     2

こういうデータがあると抽出結果は2件になっていいんですか?


やりたいことはこうじゃないんですかね??
SELECT M.*
FROM ARCHIVE_SAMPLE M
WHERE EXISTS (
SELECT AO.ArchiveID, AO.Order_SampleID
FROM ARCHIVE_ORDER AO
WHERE AO.Order_PatientID LIKE '%234%'
AND M.ArchiveID = AO.ArchiveID
AND M.Order_SampleID = AO.Order_SampleID
)

また、LIKEでUPPER()を利用していますが、不要、かつカラムに指定することで
インデックスが利かなくなります。
    • good
    • 0

前回のSQLは決してクロス結合ではないですが・・・。


データの関連性の問題ですよね。

で、別解としてEXISTSを使ってはどうでしょうか。

SELECT
*
FROM
ARCHIVE_SAMPLE M
WHERE EXISTS (
SELECT *
FROM ARCHIVE_ORDER O
WHERE M.ArchiveID = O.ArchiveID
AND M.Order_SampleID = O.Order_SampleID
AND UPPER(Order_PatientID) LIKE UPPER('%234%')
);
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!