3

「相対」と「絶対」の可能な値を持つ列挙列を持つテーブルがあります。その列の違いで行が重複している可能性があります。

したがって、通常は「絶対」値を持つ行を選択しますが、列が「相対」である「重複」行があるかどうかを確認し、代わりにその行を選択する必要があります (相対行がある場合は、絶対行も常に存在します)

擬似コード:

select *
  from table
  where non_unique_col = 123
    and IF (has result row with 'relative'
        then return that row
        else return 'absolute' row)
4

4 に答える 4

2

これを試すことができます:

SELECT *
FROM `table`
WHERE `non_unique_col` = 123
ORDER BY `absolute_relative_col` DESC
LIMIT 1

このように、結果が 1 つだけの場合は問題ありません。複数の結果がある場合は、「相対的な」結果が得られます。

編集:

@ Travesty3 の提案に従って、このクエリは、OP ステートメントに基づいて(non_unique_col + absolute_relative_col)いるという仮定に基づいて作成されていることを強調したいと思います。unique_col

その列の違いで行が重複している可能性があります

相対行がある場合は、絶対行も常に存在します

編集2:

より一般的な解決策は次のとおりです。

SELECT *
FROM `table` as t1
JOIN (
  SELECT non_unique_col, absolute_relative_col
  FROM `table`
  WHERE `absolute_relative_col` = 'relative'
) as t2 USING (non_unique_col)
WHERE t2.absolute_relative_col = 'relative' OR (
  t2.absolute_relative_col IS NULL
  AND t1.absolute_relative_col = 'absolute'
)
于 2013-08-02T12:04:46.630 に答える
0
SELECT * 
FROM table1 
INNER JOIN (
    SELECT non_unique_col nuc, 
           MAX(absolute_relative_col) rec 
    FROM table1 
    GROUP BY non_unique_col 
) AS t ON nuc=non_unique_col AND rec=absolute_relative_col
-- (@Zessx: second condition is still part of the INNER JOIN ...)

編集

しかし、私はCOALESCEのアイデアが好きです(上記のStrawberryのコメントを参照してください!)。

SELECT * FROM table1 WHERE id IN ( 
 SELECT COALESCE(b.id,a.id) FROM tablel a 
 LEFT JOIN tbl b ON b.non_unique_col=a.non_unique_col
                AND b.absolute_relative_col='relative'
)
于 2013-08-02T12:27:40.837 に答える