Woodpecker
Member
- Local time
- Today, 07:32
- Joined
- Apr 30, 2023
- Messages
- 39
Yes jdraw I already use various queries that search by these fields, but I can't search for data in fields that don't exist, because they've been deleted!
You can try this query:
SQL:SELECT n.Disk AS MissingDisks FROM Recordings r RIGHT JOIN ( SELECT DISTINCT t1.Num + t10.Num * 10 + t100.Num * 100 + t1000.Num * 1000 AS Disk FROM ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t1, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t10, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t100, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t1000 ) n ON r.Disk = n.Disk WHERE n.Disk<= ( SELECT MAX(r2.Disk) FROM Recordings r2 ) AND r.Disk IS NULL ;
Thanks, so busy writing I hadn't noticed the code. Should I cut & paste it into the criteria of a query under the 'Disk' field?You can try this query:
SQL:SELECT n.Disk AS MissingDisks FROM Recordings r RIGHT JOIN ( SELECT DISTINCT t1.Num + t10.Num * 10 + t100.Num * 100 + t1000.Num * 1000 AS Disk FROM ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t1, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t10, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t100, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t1000 ) n ON r.Disk = n.Disk WHERE n.Disk<= ( SELECT MAX(r2.Disk) FROM Recordings r2 ) AND r.Disk IS NULL ;
SELECT
n.DiskNum AS MissingDisks
FROM (
SELECT
Disk
FROM Recordings
GROUP BY
Disk
) r
RIGHT JOIN (
SELECT
t1.Num +
t10.Num * 10 +
t100.Num * 100 +
t1000.Num * 1000 AS DiskNum
FROM (
SELECT TOP 10
(
SELECT Count(o2.ID)
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o2
WHERE o.ID > o2.ID
) AS Num
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o
) AS t1, (
SELECT TOP 10
(
SELECT Count(o2.ID)
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o2
WHERE o.ID > o2.ID
) AS Num
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o
) AS t10, (
SELECT TOP 10
(
SELECT Count(o2.ID)
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o2
WHERE o.ID > o2.ID
) AS Num
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o
) AS t100, (
SELECT TOP 10
(
SELECT Count(o2.ID)
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o2
WHERE o.ID > o2.ID
) AS Num
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o
) AS t1000
) n
ON r.Disk = n.DiskNum
WHERE n.DiskNum <= (
SELECT MAX(r2.Disk) FROM Recordings r2
)
AND r.Disk IS NULL
ORDER BY
n.DiskNum
;
That's exactly what I'm trying to acheive. I'll give it a try. Thanks.OK, you will perhaps need to adjust the query a bit to just use a list of unique disk numbers.
Create a new query and switch to SQL view. Then paste in the following SQL and run it:
SQL:SELECT n.DiskNum AS MissingDisks FROM ( SELECT Disk FROM Recordings GROUP BY Disk ) r RIGHT JOIN ( SELECT DISTINCT t1.Num + t10.Num * 10 + t100.Num * 100 + t1000.Num * 1000 AS DiskNum FROM ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t1, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t10, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t100, ( SELECT TOP 10 ( SELECT Count(o2.ID) FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o2 WHERE o.ID > o2.ID ) AS Num FROM ( SELECT DISTINCT ID FROM msysobjects WHERE ID >= 0 ) AS o ) AS t1000 ) n ON r.Disk = n.DiskNum WHERE n.DiskNum <= ( SELECT MAX(r2.Disk) FROM Recordings r2 ) AND r.Disk IS NULL ORDER BY n.DiskNum ;
Whilst it looks like a lot of code, the repeating part of it (sub-query n) is just a query that will return a list of numbers from 1 to 10000.
This is limited to the maximum Disk number in your Recordings table and is joined to your list of distinct Disk numbers using a RIGHT OUTER JOIN.
You should just see a list of Disk numbers missing from your Recordings table.
The reason that Suggests --Don't delete the data from the database.Yes jdraw I already use various queries that search by these fields, but I can't search for data in fields that don't exist, because they've been deleted!
I only used a subquery to offer a single-step solution to the issue at hand.Off topic:
@cheekybuddha, the "lovers" of subqueries will surely be very enthusiastic about your suggestion.
SELECT TOP 10 (
SELECT
COUNT(o2.ID)
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o2
WHERE o.ID > o2.ID
) AS Digit
FROM (
SELECT DISTINCT
ID
FROM msysobjects
WHERE ID >= 0
) AS o;
SELECT (
1 +
t1.Digit +
t10.Digit * 10 +
t100.Digit * 100 +
t1000.Digit * 1000
) AS Num
FROM qryDigits AS t1,
qryDigits AS t10,
qryDigits AS t100,
qryDigits AS t1000
;
SELECT
n.Num AS MissingDisks
FROM (
SELECT
Disk
FROM Recordings
GROUP BY
Disk
) r
RIGHT JOIN qryTally n
ON r.Disk = n.Num
WHERE n.Num <= (
SELECT MAX(r2.Disk) FROM Recordings r2
)
AND r.Disk IS NULL
ORDER BY
n.Num
;
In my databases, such a tally table is standard equipment because I can use it very often and in different cases to my advantage. There is no reason for me to recalculate something that is the same every time instead of calculating the result once and storing it in a table. Calculating takes time. The table also offers me the option of using an index.The interesting part is being able to create a 'tally table' (a field of numbers) without creating an actual table and having to populate it.
Conversely, there's no need to have an extra table in your database if it's only used once or occasionally.In my databases, such a tally table is standard equipment because I can use it very often and in different cases to my advantage. There is no reason for me to recalculate something that is the same every time instead of calculating the result once and storing it in a table. Calculating takes time. The table also offers me the option of using an index.
David, ebs17,Conversely, there's no need to have an extra table in your database if it's only used once or occasionally.
Calculating the above up to 10000 numbers is pretty instantaneous, and you can also have the flexibility to create it smaller or larger if fewer or more numbers are required. Otherwise, you have to keep an eye on whether there are adequate numbers in your table.
(I'm not disagreeing with you, I usually have a tally table and also an equivalent for dates in my dbs)
Exactly!Isn't the idea of a tally table-whether a real table or a couple of saved queries- and an unmatched query (as I showed in #14) the same concept?