次のような3列のテーブルがあります。
+------------+---------------+-------+
| Country_id | country_title | State |
+------------+---------------+-------+
このテーブルには多くのレコードがあります。それらの一部にはstate
があり、他の一部にはありません。今、これらの記録を想像してください:
1 | Canada | Alberta
2 | Canada | British Columbia
3 | Canada | Manitoba
4 | China |
重複のない国名が必要です。実際、id
とtitle
が必要です。これを作成するのに最適なSQLコマンドは何ですか?下のフォームでDISTINCT
を使用しましたが、適切な結果を得ることができませんでした。
SELECT DISTINCT title,id FROM tbl_countries ORDER BY title
私の望ましい結果は次のようなものです。
1, Canada
4, China
これを試して:
SELECT MIN(id) AS id, title
FROM tbl_countries
GROUP BY title
DISTINCT
はキーワードです
私にとってあなたの質問は正しいです
最初にこれを試してみてください
SELECT DISTINCT title,id FROM tbl_countries
後で注文することができます。
DISTINCT
キーワードを使用するには、次のように使用できます。
SELECT DISTINCT
(SELECT min(ti.Country_id)
FROM tbl_countries ti
WHERE t.country_title = ti.country_title) As Country_id
, country_title
FROM
tbl_countries t
ROW_NUMBER()
を使用するには、次のように使用できます。
SELECT
Country_id, country_title
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY country_title ORDER BY Country_id) As rn
FROM tbl_countries) t
WHERE rn = 1
また、LEFT JOIN
を使用すると、これを使用できます。
SELECT t1.Country_id, t1.country_title
FROM tbl_countries t1
LEFT OUTER JOIN
tbl_countries t2 ON t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id
WHERE
t2.country_title IS NULL
EXISTS
を使用すると、次のことを試すことができます。
SELECT t1.Country_id, t1.country_title
FROM tbl_countries t1
WHERE
NOT EXISTS (SELECT *
FROM tbl_countries t2
WHERE t1.country_title = t2.country_title AND t1.Country_id > t2.Country_id)
MySQLでは、特別な列関数GROUP_CONCATを使用できます。
SELECT GROUP_CONCAT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'computers' AND
TABLE_NAME='Laptop' AND
COLUMN_NAME NOT IN ('code')
ORDER BY ORDINAL_POSITION;
MySQLの情報スキーマは、特定のデータベースではなく、すべてのデータベースサーバーを対象としています。そのため、異なるデータベースに同じ名前のテーブルが含まれる場合、WHERE句の検索条件でスキーマ名TABLE_SCHEMA = 'computers'を指定する必要があります。
文字列は、MySQLのCONCAT関数と連結されます。問題の最終的な解決策は、MySQLで次のように表現できます。
SELECT CONCAT('SELECT ',
(SELECT GROUP_CONCAT(COLUMN_NAME)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='computers' AND
TABLE_NAME='Laptop' AND
COLUMN_NAME NOT IN ('code')
ORDER BY ORDINAL_POSITION
), ' FROM Laptop');
Having
句は、Oracleで重複エントリを見つける最も簡単な方法であり、rowid
を使用して重複データを削除できます。
DELETE FROM products WHERE rowid IN (
SELECT MAX(sl) FROM (
SELECT itemcode, (rowid) sl FROM products WHERE itemcode IN (
SELECT itemcode FROM products GROUP BY itemcode HAVING COUNT(itemcode)>1
)) GROUP BY itemcode);
これを試して
SELECT country_id, country_title
FROM (SELECT country_id, country_title,
CASE
WHEN country_title=LAG(country_title, 1, 0) OVER(ORDER BY country_title) THEN 1
ELSE 0
END AS "Duplicates"
FROM tbl_countries)
WHERE "Duplicates"=0;
select Country_id,country_title from(
select Country_id,country_title,row_number() over (partition by country_title
order by Country_id ) rn from country)a
where rn=1;
SQLの重複行を無視します。これはあなたに役立つと思います。
SELECT res2.*
FROM
(SELECT res1.*,ROW_NUMBER() OVER(PARTITION BY res1.title ORDER BY res1.id)as num
FROM
(select * from [dbo].[tbl_countries])as res1
)as res2
WHERE res2.num=1