我有一張大桌子,有超過 100 萬行和 96 列。
使用 SQL 我想找到每個值都相同的行。該表沒有任何主鍵,所以我不知道如何處理這個問題。我不允許更改表結構。
我見過人們使用 count(*) 和 group by,但我不確定這對于 96 列的表是否有效。
uj5u.com熱心網友回復:
使用COUNT()作為分析函式,我們可以嘗試:
WITH cte AS (
SELECT *, COUNT(*) OVER (PARTITION BY col1, col2, ..., col96) cnt
FROM yourTable
)
SELECT col1, col2, ..., col96
FROM cte
WHERE cnt > 1;
uj5u.com熱心網友回復:
您可以使用 md5 函式作為主鍵。
select count(1),md5_col,* from (
select md5(concat_ws('',col1,col2)) as md5_col,* from db_name.table_name) tt group by md5_col;
uj5u.com熱心網友回復:
與其試圖用一個 sql 查詢(你當然可以這樣做......)來解決整個問題,我建議使用表上的任何索引或統計資訊來過濾掉盡可能多的行。
首先找到具有最多/最少唯一值的列(假設您有統計資訊),然后將它們相互粉碎以快速排除盡可能多的行。獲取結果,將它們轉儲到臨時表,根據需要索引欄位,然后重復。
或者你可以這樣做:
Declare @sql nvarchar(max);
Select @sql='select column1 from schema.table where case ' stuff((select 'when col1!=' quotename(name) ' then 0 ' from sys.columns where object_id=object_id('schema.table') for xml path(''),Type).value('.','nvarchar(max)'),1,11,'') 'else 1 end = 1';
Exec sp_executesql @sql;
如果您必須在生產中運行查詢的恐怖表演,請使用快照隔離或首先將其移動到臨時表(除非沒有人更新該表。
(老實說,我可能會在包含我的過濾資料集的臨時表上使用類似的查詢......你可以做任何事情來確保比較不幼稚(例如考慮到統計資料)可以改進你的表現顯著。如果你想一次完成所有事情,你總是可以將 sys.tables 加入一個臨時表,將你的欄位比較放入一個深思熟慮的順序。畢竟,一旦發現一個案例陳述是真的,所有的其他人將被跳過該記錄。)
uj5u.com熱心網友回復:
為方便起見,請使用BINARY_CHECKSUM:
with cte as (
select *, BINARY_CHECKSUM(*) checksum
from mytable
), cte2 as (
select checksum
from cte
group by checksum
having count(*) > 1
)
select distinct t1.*
from cte t1
join cte t2 on t1.checksum = t2.checksum
and col1 = col2
and col2 = col2
-- etc
where t1.checksum in (select checksum from cte2)
cte2將(幾乎)只回傳真正匹配的行,因此連接條件不會有很多行來詳盡地比較每一列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441794.html
上一篇:我可以使用ALL運算子來測驗“組”的所有值是否存在于另一個查詢/集中?如果是這樣,怎么做?
下一篇:如何在SQL中獲取可用時間串列?
